The Little Schemer中原始函数的范围是否不正确?

时间:2017-10-31 08:55:43

标签: scheme the-little-schemer

考虑以下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,最终hardwiredactual primitives

我认为正确的实现方法是不对原始名称进行特殊检测,而是在value function中创建一个包含将原语名称映射到实际原始实现的条目的初始表。

我的问题是:这是The Little Schemer的计划实施中的错误吗?这种行为是否在计划中有明确规定,或者在1974年编写本书时可能没有明确规定?

1 个答案:

答案 0 :(得分:3)

这是一个错误吗?

是否是错误的问题是确定解释器是否应该遵循方案范围规则。自从你提到1974年以来,它就是第一个方案报告发布的前一年,但许多想法可能是当时写的,什么是方案是小型口译员,可能是由具有各种微妙差异的研究生共享的。

小Schemer最初被称为The Little Lisper,后来在Lisp下工作成为Common Lisp。当重写它以遵循Scheme时,他们试图保留早期的大部分代码,因此解释器可能具有与Scheme不同的功能。

RNRS计划报告的内容

如果解释器要符合方案报告,则必须允许绑定以遮蔽顶级绑定。以下是有关Variables, syntactic keywords, and regions

的R5RS报告的引用
  

每次提及标识符都指标识符的绑定   建立了包含使用的最里面的区域。如果   没有绑定区域包含使用的标识符,   然后,use指的是顶层变量的绑定   环境

对于以后的报告,例如same section in R6RS顶级会被替换为"定义或导入封闭库或顶级程序的顶部"。