【发布时间】:2018-04-12 09:11:02
【问题描述】:
考虑以下 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 被呈现为primitive,这最终是hardwired 到actual primitives。
我相信正确的实现是不对原始名称进行特殊检测,而是在value function 中创建一个初始表,其中包含一个将原始名称映射到实际原始实现的条目。
我的问题是:这是 The Little Schemer 实施方案中的错误吗?这种行为是否在方案中得到了很好的说明,还是在 1974 年写这本书时没有很好地说明?
【问题讨论】:
-
AFAIK 小计划者不使用特定的计划实现,请说明您正在使用的解释器(或库)的 什么 版本。
-
@ÓscarLópez 第 10 章构建了自己的 Scheme 解释器 (code)。这就是 OP 所要求的。
-
你真的在看第一版吗?可能不是,它被命名为Little Lisper,是吗?我永远找不到它。
-
不,我有 The Little Schemer。我现在意识到我误读了这本书的版权。它提到了 1974 年,但提到了 The Little Lisper。现在我很好奇原来的算法是什么:)