【问题标题】:Seeking clarification on Scheme eval寻求澄清方案评估
【发布时间】:2014-03-23 18:46:33
【问题描述】:

我对@9​​87654324@ 感到困惑。我在schemers.org 中查看了eval 的规范。它说

程序:(eval expression environment-specifier)

这表明environment-specifier 是强制性要求。但是,当我使用两个解释器(repl.itElk Scheme 的一个)测试eval 时,它们都可以在没有environment-specifier 的情况下工作。我的问题是:他们都是不符合标准的解释器,还是我在 schmers.org 上阅读的文档有误?

然后..

Elk Scheme 评估 (eval 5)(eval (list + 5 6)) 没有问题,但 repl.it 的 Scheme 解释器无法评估它们。后者将评估 (eval `(+ 5 6)) 罚款但不是前两个表达式。我的问题是:repl.it 解释器的行为是否符合要求?

其他 Scheme 解释器如何处理前两个表达式?

【问题讨论】:

  • 如果没有,它通常意味着(interaction-environment),它是当前在 REPL 中处于活动状态的内容(如果有,则创建一个新的“默认”环境)。编辑:在很多情况下,您想指定自己的环境(即在增量编译器中,eval 只是编译器的接口)。
  • 似乎标准确实需要第二个参数。
  • 我不确定一致性的定义是否很清楚,因为 Scheme 可以通过 rest args 支持可选参数。可以说,只要支持标准定义的情况,其他用法只是未定义的行为,不会影响一致性。 repl.it 解释器所描述的行为非常奇怪,但也不影响一致性,因为带有一个参数的 eval 可以为所欲为,包括炸毁您的计算机。

标签: scheme


【解决方案1】:

Scheme 报告是您编写兼容程序时需要遵循的。除此之外,实现本身可以有自己的语法和过程,并且不会干扰,因为符合标准的程序不会使用它们。并非所有 Scheme 报告都强制要求 eval,因此您需要找出它应该符合哪个报告,以及是否需要一些转换来遵循标准。例如。 ikarus 需要--r6rs-script 作为正确运行 R6RS 程序的开关。我认为Elk 是R4RS,所以eval 没有在该报告中指定,并且BiwaScheme 似乎在其源代码中引用了R6RS,因此它应该采用第二个参数。它的工作原理并不能证明它是合规的,所以你应该在他们的文档中挖掘一下。

此外,在报告中定义为未定义的所有内容,您实际上可能选择了一些内容,但它仍然根据报告。例如。我已经看到define 返回绑定的对象,所有! 过程都返回它变异的对象,这一切都根据报告,因为任何值都等于报告的未定义值。

此外,报告中很少有错误需要发出错误信号。由于不是强制发出错误信号,因此由开发人员确保他们不会做任何被认为是错误的事情。这些实现实际上可能会返回一个非常错误的值、崩溃,或者如果它是一个很好的实现,它会发出错误信号。其中任何一项都适用于报告。事实上,这就是其中之一:

(define (test) "hello")
(string-set! (test) 0 #\H) ; might signal an error
(test)                     ; might evaluate to "hello", "Hello"

在大多数 Scheme 实现中,您不会收到任何错误,它可能会使 test 返回 "Hello"。该报告明确指出这是一个错误,所以我想这意味着你永远不应该为任何 Scheme 解释器编写这样的程序,因为结果是未定义的。

【讨论】:

  • 我能够验证 Elk 实现了 R4RS。他们对eval 有自己的看法是有道理的。需要找到更多关于 BiwaScheme 的信息。我一直无法找到它符合哪个方案报告。它当然没有过程scheme-report-environment 和'null-environment`。
猜你喜欢
  • 2023-03-23
  • 2020-02-10
  • 2017-10-29
  • 1970-01-01
  • 1970-01-01
  • 2018-10-10
  • 2021-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多