scheme中的数字是否需要加引号?
在以下示例中(在ikarus中测试),似乎引用数字无关紧要,而过多引用会产生问题。
> (+ '1 1)
2
> (+ '1 '1)
2
> (+ '1 ''1)
1
使用数字的标准方法是什么(例如在函数体的定义中)?引用或不引用?
Scheme中的数为自求值。这意味着无论它们是否被引用,它们的行为都是一样的。
如果你在DrRacket中输入(some 1)
并启动宏步进并禁用宏隐藏调用将最终看起来像:
(#%app call-with-values (lambda () (#%app some (quote 1))) print-values))
因此,Racket实际上引用了自求值,因为它们的运行时在核心语言/完全扩展程序中不支持自求值。
可能在某些实现中,即使在Racket威胁它们相同的情况下,未引用的数字和引用的数字也会被不同地评估,但是如果它有任何实际影响,那将是令人惊讶的。
大多数程序员都很懒,不会引用自求值代码。唯一的例外是与读者的交流。如。在Common Lispnil
中,()
和引号中的变体都是相同的,并且确实可以在任何地方使用()
,但是当对象用作布尔值时,许多人选择使用nil
,如果对象用作文字列表,则选择使用'()
。
R6RS对引用的定义是这样说的:
(quote <datum>)
语法语法:
<Datum>
应该是一个语法基准。语义:
(quote <datum>)
求值为<datum>
(见4.3节)。这个符号用于包含常量.
所以做'"aa"
或'123
是正确的,但我从未见过它,我会发现阅读引用数字或其他常量的代码很有趣。
在较旧的lisp中,如emacs lisp,它是相同的(在emacs lisp中语法称为sexp
或S-Expression
而不是datun
)。但quotation
意义的真正起源来自麦卡锡,并在A Micro-Manual for Lisp
中有所描述。