关于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":复数、有理数、大整数、多精度浮点数等。
我的理解是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 get1000.0
? The exponentE3
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":复数、有理数、大整数、多精度浮点数等。