Scheme中的define表达式返回的值

Flu*_*lux 3 scheme sicp mit-scheme

我在MIT/GNU Scheme中运行它:

(define x (+ 2 3))
Run Code Online (Sandbox Code Playgroud)

解释器然后打印:

;Value: x
Run Code Online (Sandbox Code Playgroud)

但是根据我的教科书,define表达式返回的值应该是未定义的.为什么翻译打印";值:x"呢?

Syl*_*ter 6

如果标准报告未指定返回或提及未定义,则实现可以自由选择返回的值,并且它将根据标准.这也意味着你不能依赖于一个实现行为将与另一个相同.

举一个R6RS的例子:

(if #f #t) ; ==> "banana"
Run Code Online (Sandbox Code Playgroud)

......完全正确.由于谓词计算结果#f并且没有提供替代表达式,因此实现选择字符串"banana"作为结果.稍微不同寻常但仍然是标准中未定义的非常好的价值.

选择可以使用的合理值可能会给用户带来糟糕的想法,这些想法可能会欺骗他们在不同但标准兼容的实现中运行时产生错误的代码.因此,您有许多实现实际上将值定义为唯一的未定义值,它将用于代替报表中的所有未定义值,并且经常被REPL忽略.

以下是(list (if #f #t))在不同实现中评估的一些示例.将其包装在一个list使得REPL显示一个列表,其中包含一个可能被抑制的值:

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

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

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

;; gambit
==> (#!void)

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

;; biwa
==> (#<undef>)
Run Code Online (Sandbox Code Playgroud)