【问题标题】:Is the scope of primitive functions in The Little Schemer incorrect?The Little Schemer 中原始函数的范围是否不正确?
【发布时间】: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,这最终是hardwiredactual primitives

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

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

【问题讨论】:

  • AFAIK 小计划者不使用特定的计划实现,请说明您正在使用的解释器(或库)的 什么 版本。
  • @ÓscarLópez 第 10 章构建了自己的 Scheme 解释器 (code)。这就是 OP 所要求的。
  • 你真的在看第一版吗?可能不是,它被命名为Little Lisper,是吗?我永远找不到它。
  • 不,我有 The Little Schemer。我现在意识到我误读了这本书的版权。它提到了 1974 年,但提到了 The Little Lisper。现在我很好奇原来的算法是什么:)

标签: scheme the-little-schemer


【解决方案1】:

这是一个错误吗?

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

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

RNRS 计划报告的内容

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

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

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

【讨论】:

  • 此行为是否未在任何地方的标准中指定?我一直在尝试浏览一些报告,但只了解了 The Little Schemer 所教的内容,我觉得我还没有足够的知识来准确地解释它。
  • @JeremyHuiskamp 根据报告(所有报告),词法运行时变量绑定胜过顶级绑定。解释器不是 Scheme 解释器,而是一种小scheme 方言。例如。球拍是一种方案方言,因为它遵循 R5RS 报告的除某些方面之外的所有方面。
  • 是的,我意识到这本书描述了一种方言,但在大多数情况下,它解释了它的出发点,例如 add1/sub1 而不是 +/-,需要定义 atom?,显然很多东西不见了。但是在这样的细节上分歧有点不同。你有没有机会指出我在其中一份报告中阐明这一点的特定地点?
  • @JeremyHuiskamp 是的。 “每次提及标识符都是指建立包含使用的最内层区域的标识符的绑定。如果区域包含使用的标识符没有绑定,则使用是指对变量的绑定顶级环境”R5RSR6RS 版本,将导入添加到组合中。
  • 谢谢!指向规范的指针几乎就是我正在寻找的答案。如果您可以将其编辑到您的答案中,或者写一个新的,我会将其标记为已接受。我仍然很好奇 为什么 它是这样的。我想这与这本书的非计划历史有关......
猜你喜欢
  • 1970-01-01
  • 2015-10-22
  • 2012-09-06
  • 2010-12-15
  • 2012-05-16
  • 2014-06-28
  • 2010-12-30
  • 2011-10-23
  • 2011-06-14
相关资源
最近更新 更多