考虑以下s-expression:
((lambda (car) (car (quote (a b c)))) cdr)
在我尝试过的大多数方案实现中,这个求值为(b c)
,因为cdr
被传递给lambda,它命名为car
,优先于原始实现car
。
Little Schemer提供了第10章中用方案编写的方案的实现。该实现为上面的表达式返回a
,这对我来说似乎不正确。
很清楚为什么实现的行为如此:原始函数的名称被视为*const
而不是*identifier
here。不是数字或布尔值的*const
呈现为primitive,最终hardwired为actual primitives。
我认为正确的实现方法是不对原始名称进行特殊检测,而是在value function中创建一个包含将原语名称映射到实际原始实现的条目的初始表。
我的问题是:这是The Little Schemer的计划实施中的错误吗?这种行为是否在计划中有明确规定,或者在1974年编写本书时可能没有明确规定?
答案 0 :(得分:3)
是否是错误的问题是确定解释器是否应该遵循方案范围规则。自从你提到1974年以来,它就是第一个方案报告发布的前一年,但许多想法可能是当时写的,什么是方案是小型口译员,可能是由具有各种微妙差异的研究生共享的。
小Schemer最初被称为The Little Lisper,后来在Lisp下工作成为Common Lisp。当重写它以遵循Scheme时,他们试图保留早期的大部分代码,因此解释器可能具有与Scheme不同的功能。
如果解释器要符合方案报告,则必须允许绑定以遮蔽顶级绑定。以下是有关Variables, syntactic keywords, and regions
的R5RS报告的引用每次提及标识符都指标识符的绑定 建立了包含使用的最里面的区域。如果 没有绑定区域包含使用的标识符, 然后,use指的是顶层变量的绑定 环境
对于以后的报告,例如same section in R6RS顶级会被替换为"定义或导入封闭库或顶级程序的顶部"。