scheme - 关于Scheme中的引号(')

标签 scheme lisp chicken-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 是一种将程序主体的一部分作为文字对象访问的一种方式,将该对象传递到程序的运行时值空间中。

3/3 是一个表示数字的标记。该数字是 1.0。有些对象有不止一个“拼写”。有时您在将对象输入 Lisp 系统时使用一种拼写,而在打印时使用不同的拼写。

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

尝试输入 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 没有完全支持有理数,“开箱即用”。请参阅此邮件列表帖子:

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

另请参阅推荐:有一个名为 numbers 的“鸡蛋”(Chicken Scheme 模块)提供了“全数字塔”。 “数字塔”是数字类型系统的 Lisp 行话。 “完整的塔”意味着拥有“作品”:复数、有理数、大整数、多精度 float 等。

关于scheme - 关于Scheme中的引号('),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44528168/

相关文章:

linux - 在 Chicken Scheme 中运行系统命令的最佳方式

scheme - 如何在方案中创建列表列表?

c - 为什么 C 是编译器的语言——当 Scheme 子集似乎更合适时?

recursion - 生成递归和结构递归有什么区别?

lisp - 根据符号和指数对多项式排序

macros - 宏: value is not of type LIST

macros - 这些宏有什么区别?

scheme - Scheme 中的多行注释 (RnRS)

scheme - SICP练习1.5和1.6

lisp - 我对符号求值器对动态变量集进行推导的想法