scheme中的数字是否需要加引号?



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中语法称为sexpS-Expression而不是datun)。但quotation意义的真正起源来自麦卡锡,并在A Micro-Manual for Lisp中有所描述。

最新更新