Little Schemer 中的 `quote` 有歧义。啥时候应该在表达式中加上引号,啥时候不应该?
Posted
技术标签:
【中文标题】Little Schemer 中的 `quote` 有歧义。啥时候应该在表达式中加上引号,啥时候不应该?【英文标题】:Ambiguity with `quote` in the Little Schemer. When should an expression be proceeded with a quote and when shouldn't it?Little Schemer 中的 `quote` 有歧义。什么时候应该在表达式中加上引号,什么时候不应该? 【发布时间】:2022-01-15 22:51:20 【问题描述】:Friedman 和 Felleisen 的 Little Schemer 4e 从定义 atom?
开始:
(define atom?
(lambda (x)
(and (not (pair? x)) (not (null? x)))))
然后在第一章中,有一些问题询问某某是否是一个原子。例如。 (为清楚起见,脚注重新措辞):
这是一个原子是真的吗?
atom
**在方案中:
(quote atom)
或'atom
上面写着turkey
、1492
、u
和 *abc$
也是原子。
除1492
之外的所有这些都必须以'
开头 - 否则我们会得到Error: execute: unbound symbol:
1492
和 '1492
都可以工作。从此以后,在这本书中,我怎么知道什么时候应该或不应该在某些内容之前加上引号 ('
)?这很令人困惑。我希望作者只是明确地引用了引号——在表达式前面加上一个单引号 ('
) 真的会增加那么多视觉噪音吗?我是否应该假设所有内容前面都有一个引号 ('
)?
【问题讨论】:
【参考方案1】:原子。原子是不可分割的东西。像13
或72
这样的值是不可分割的,它是一个单一的值。还有其他原子,像"hello"
这样的字符串,像x
或y
这样的变量,像:keyword
或'something
这样的值。
在编写 Lisp 时,原子由空格或括号分隔。然后我们可以通过将原子放在括号内来创建一个或多个form
,例如(* 2 (+ 1 3))
。这里的原子是:
然后有几个问题。对于初学者,x
是指原子'x
、名为x
的变量,还是存储在变量x
中的值? Lisp 假定 x
是一个变量,因此键入 x
会返回 x
的值,或者会产生关于 x
未绑定的错误。在x
前面加上一个单引号,如'x
,表示“请不要尝试评估这个”。
表单具有一致的格式(operator data1 data2 data3 ...)
。但是,如果您只想提供数据会发生什么?你用什么运算符?答案是使用运算符quote
,它将表单评估为仅数据。因为一直说引号很烦人,所以 Lisp 允许你说'(data1 data2 data3 ...)
。
至于'1492
,这与Scheme和Common Lisp中的1492
相同。这些值是可互换的。我会使用1492
,因为引用是多余的。
【讨论】:
以上是关于Little Schemer 中的 `quote` 有歧义。啥时候应该在表达式中加上引号,啥时候不应该?的主要内容,如果未能解决你的问题,请参考以下文章
今日好书丨《The Little Schemer:递归与函数式的奥妙》
Little_by_little_4 创建一个椒盐噪声的pytorch.transform
Clojure.logic 与 The Reasoned Schemer 的区别
不理解 The Reasoned Schemer 第 5 章 62