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>)
我运行这个在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>)