我在麻省理工学院/ GNU计划中运行了这个:
(define x (+ 2 3))
解释器然后打印:
;Value: x
但是根据我的教科书,定义表达式返回的值应该是未定义的。为什么翻译打印&#34 ;;价值:x"然后?
答案 0 :(得分:6)
如果标准报告未指定返回或提及未定义,则实现可以自由选择返回的值,并且它将根据标准。这也意味着你不能依赖于一个实现行为将与另一个相同。
举一个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>)