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

上面写着turkey1492u*abc$ 也是原子。

1492 之外的所有这些都必须以' 开头 - 否则我们会得到Error: execute: unbound symbol:

1492'1492 都可以工作。从此以后,在这本书中,我怎么知道什么时候应该或不应该在某些内容之前加上引号 (')?这很令人困惑。我希望作者只是明确地引用了引号——在表达式前面加上一个单引号 (') 真的会增加那么多视觉噪音吗?我是否应该假设所有内容前面都有一个引号 (')?

【问题讨论】:

【参考方案1】:

原子。原子是不可分割的东西。像1372 这样的值是不可分割的,它是一个单一的值。还有其他原子,像"hello"这样的字符串,像xy这样的变量,像:keyword'something这样的值。

在编写 Lisp 时,原子由空格或括号分隔。然后我们可以通过将原子放在括号内来创建一个或多个form,例如(* 2 (+ 1 3))。这里的原子是:

运算符 + 和 * 值 1、2 和 3 形式 (+ 1 3) 和 (* 2 ...)

然后有几个问题。对于初学者,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

为啥“The Reasoned Schemer”在其函数末尾添加一个“o”?

AppWidget API文档翻译+little解读