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

Is the scope of primitive functions in The Little Schemer incorrect?

考虑以下 S 表达式:

((lambda (car) (car (quote (a b c)))) cdr)

在我尝试过的大多数方案实现中,它的计算结果为 (b c),因为 cdr 被传递给 lambda,后者将其命名为 car,优先于原始实现car.

Little Schemer在第10章的scheme中提供了一个scheme的实现,那个实现returns a上面的表达式,我觉得不对

很明显为什么该实现会这样:原始函数的名称被视为 *const 而不是 *identifier here. A *const which is not a number or boolean is rendered as a primitive and this is eventually hardwired to the actual primitives.

我相信正确的实现是不对原始名称进行特殊检测,而是在 value function 中创建一个初始 table,其中包含一个将原始名称映射到实际的原始实现。

我的问题是:这是小阴谋家实现scheme的bug吗?这种行为是在方案中明确规定的,还是在 1974 年写这本书时没有明确规定的?

这是一个错误吗?

是否是错误的问题是确定解释器是否应该遵循 Scheme 范围规则。由于您提到 1974 年,这是第一份 Scheme 报告发布的前一年,但许多想法可能是当时写的,后来成为 Scheme 的是小型解释器,可能在研究生之间共享,具有各种细微差别.

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

RNRS 计划报告的内容

如果解释器要符合方案报告,它必须允许绑定隐藏顶级绑定。这是 R5RS 报告中关于 Variables, syntactic keywords, and regions

的引述

Every mention of an identifier refers to the binding of the identifier that established the innermost of the regions containing the use. If there is no binding of the identifier whose region contains the use, then the use refers to the binding for the variable in the top level environment

对于以后的报告,例如 same section in R6RS 顶级被替换为 "definition or import at the top of the enclosing library or top-level program"。