scheme - Scheme 中定义表达式返回的值

标签 scheme sicp mit-scheme

我在 MIT/GNU Scheme 中运行了这个:

(define x (+ 2 3))

然后解释器打印:

;Value: x

但是根据我的教科书,define 表达式返回的值应该是未定义的。为什么解释器会打印“;Value: x”?

最佳答案

如果标准报告未指定返回值或提到它是未定义的,则实现实际上可以自由选择返回值,并且它会符合标准。这也意味着您不能依赖一个实现行为与另一个实现行为相同。

以R6RS为例:

(if #f #t) ; ==> "banana"

...完全正确。由于谓词的计算结果为 #f 并且没有提供替代表达式,因此实现选择字符串 "banana" 作为其结果。有点不合常规,但仍然是一个非常不错的值未在标准中定义

选择可以使用的合理值可能会给用户带来不好的想法,当他们在不同但符合标准的实现中运行时,可能会愚弄他们制作错误的代码。因此,您有许多实现实际上将一个值定义为唯一未定义的值,它将用于代替报告中的所有未定义值,并且经常被 REPL 忽略。

下面是一些在不同实现中评估 (list (if#f#t)) 的例子。将它包装在一个 list 中使 REPL 显示一个列表,其中包含一个可能被隐藏的值:

;; racket in r5rs
==> (#<void>)

;; chicken
==> (#<unspecified>)

;; ikarus
==> (#<void>)

;; gambit
==> (#!void)

;; mit-scheme
==> (#!unspecific)

;; biwa
==> (#<undef>)

关于scheme - Scheme 中定义表达式返回的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41213786/

相关文章:

scheme - 模块中的未绑定(bind)标识符 - DrRacket

lisp - 通过 SICP 工作的最佳方案实现是什么?

recursion - 有人可以解释递归在这些过程中是如何工作的吗

scheme - 评估顺序,SICP 练习

lisp - 语法绑定(bind)值必须是关键字 : alpha. 什么意思?

list - Racket/Scheme 中的抽象列表函数 - 列表中元素出现的次数

haskell - 如何深入理解SICP中描述的信号流图?

scheme - 方案/内存中的数组

c - 如何在 C 中实现将名称与 void 函数相关联的映射?

math - 我在这个计算 PI 的 Scheme 程序中找不到我的错误