[英]Is the scope of primitive functions in The Little Schemer incorrect?
考慮以下s表達式:
((lambda (car) (car (quote (a b c)))) cdr)
在我嘗試的大多數方案實現中,這個求值為(bc)
因為cdr
被傳遞給lambda,lambda命名為car
,優先於car
的原始實現。
該小策士提供寫在方案中第10章。這實現返回方案的實施a
針對上述表達,這似乎是不正確的我。
很清楚為什么實現的行為如此:原始函數的名稱在這里被視為*const
而不是*identifier
。 不是數字或布爾值的*const
呈現為基元,並且最終硬連線到實際基元 。
我相信正確的實現方法是不對原始名稱進行特殊檢測,而是在value函數中創建一個初始表,該表包含將原始名稱映射到實際原始實現的條目。
我的問題是:這是Little Schemer實施計划中的一個錯誤嗎? 這種行為是否在計划中有明確規定,或者在1974年編寫本書時可能沒有明確規定?
是否存在錯誤的問題是確定解釋器是否應該遵循Scheme作用域規則。 自從你提到1974年以來,它就是第一個方案報告發布的前一年,但許多想法可能是當時寫的,什么是方案是小型口譯員,可能是由具有各種微妙差異的研究生共享的。
小Schemer最初被稱為The Little Lisper,后來在Lisp下工作成為Common Lisp。 當重寫它以遵循Scheme時,他們試圖保留早期的大部分代碼,因此解釋器可能具有與Scheme不同的功能。
如果解釋器要符合方案報告,則必須允許綁定以遮蔽頂級綁定。 以下是R5RS報告中有關變量,語法關鍵字和區域的引用
每次提及標識符都指的是建立包含使用的最內部區域的標識符的綁定。 如果沒有綁定其區域包含use的標識符,則use指的是頂級環境中變量的綁定
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.