关于Scheme中的引号(')

Regarding the quote (') in Scheme

我的理解是Scheme中的单引号'是用来告诉Scheme后面跟着的是符号不是变量。因此,不应对其进行评估。 基于这种理解,当我在 REPL 中输入 '3/3 时,我不明白为什么 Chicken 会打印 1.0

CHICKEN
(c) 2008-2016, The CHICKEN Team
(c) 2000-2007, Felix L. Winkelmann
Version 4.11.0
linux-unix-gnu-x86-64 [ 64bit manyargs dload ptables ]
compiled 2016-08-23 on buildvm-13.phx2.fedoraproject.org

#;1> '3/3
1.0

我预计它会打印 3/3。为什么要对此进行评估而不是提供报价? 谢谢。

Quote 是一种扩展为 quote 表达式的语法。也就是说,'X就是(quote X),不管X是什么。 quote 是一个运算符,其值是参数语法本身。例如,(quote (+ 2 2)) 的值是列表 (+ 2 2) 本身,而不是值 4。同样,(quote a) 生成符号 a 而不是表达式 a.

的值

与其他 Lisp 方言一样,Scheme 程序是用数据符号编写的。 Scheme 程序源代码的每个元素都对应一个 Scheme 程序可以操作的可识别数据结构。 quote 是一种将程序主体的一部分作为文字对象访问的方法,将该对象传递到程序的 space 的 运行 时间值中。

3/3 是表示数字的标记。这个数字是 1.0。有些对象不止一个"spelling"。有时你在将对象输入 Lisp 系统时使用一种拼写,而当它被打印时,使用不同的拼写。

3/3 求值不是通常的表达式求值,而是扫描令牌并将其转换为对象时发生的事情。

尝试输入 3/3 不带 引号。

打个比方:你的问题是这样的:

How come when I type '1.0E3, I get 1000.0? The exponent E3 is being evaluated in spite of the quote!

但是,我希望 3/3'3/3 产生 1 而不是 1.0

之所以3/3表示1.0是因为Chicken Scheme没有完全支持有理数,"out of the box"。请参阅此邮件列表帖子:

https://lists.gnu.org/archive/html/chicken-users/2013-03/msg00032.html

另请参阅推荐:有一个名为 numbers 的 "egg"(Chicken Scheme 模块)提供了 "full numerical tower"。 "Numerical tower" 是数字类型系统的 Lisp 行话。 "full tower" 表示具有 "the works":复数、有理数、大整数、多精度浮点数等。