Scheme 中定义表达式返回的值

Value returned by a define expression in Scheme

我运行这个在MIT/GNU方案中:

(define x (+ 2 3))

然后解释器打印:

;Value: x

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

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

以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>)