3

考虑以下 s 表达式:

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

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

Little Schemer 提供了第 10 章中用 scheme 编写的 scheme 实现。该实现返回a上述表达式,这对我来说似乎不正确。

很清楚为什么该实现会这样:原始函数的名称被视为*const而不是*identifier here*const不是数字或布尔值的A被渲染为基元,最终硬连线实际的基元

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

我的问题是:这是 The Little Schemer 实施方案中的错误吗?这种行为是否在方案中得到了很好的说明,还是在 1974 年写这本书时没有很好地说明?

4

1 回答 1

3

它是一个错误吗?

它是否是错误的问题是确定解释器是否应该遵循 Scheme 范围规则。既然你提到了 1974 年,那是第一份 Scheme 报告发布的前一年,但是很多想法可能是当时写的,而后来成为 Scheme 的就是小型解释器,可能在研究生之间共享,有各种细微的差异.

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

RNRS 计划报告的内容

如果解释器要符合方案报告,它必须允许绑定隐藏顶级绑定。这是 R5RS 报告中关于变量、句法关键字和区域的引用

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

对于以后的报告,如R6RS顶层中的同一部分,将替换为“在封闭库或顶层程序的顶部定义或导入”。

于 2017-10-31T19:55:25.827 回答