Little Schemer 中 quote 的歧义。什么时候应该在表达式后加上引号,什么时候不应该?

Ambiguity with `quote` in the Little Schemer. When should an expression be proceeded with a quote and when shouldn't it?

Friedman 和 Felleisen 的 Little Schemer 4e 首先定义 atom?:

(define atom?
    (lambda (x)
        (and (not (pair? x)) (not (null? x)))))

然后在第一章中有问题询问某某是否是原子。例如。 (为清楚起见,对脚注进行了改写):

Is it true that this is an atom?

atom*

*in Scheme: (quote atom) or 'atom

表示turkey1492u*abc$也是原子

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

1492'1492 都有效。从今以后,在这本书中,我如何知道什么时候应该或不应该在某件事之前加上引号 (')???这很混乱。我希望作者只是明确地使用引号——在表达式之前使用单引号 (') 真的会增加那么多视觉噪音吗???我是否应该假设所有内容都以引号 (') 开头?

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

这样的值

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

  • 运算符 + 和 *
  • 值 1、2 和 3
  • 表格 (+ 1 3) 和 (* 2 ...)

然后有几个问题。对于初学者,x 是指原子 'x、称为 x 的变量,还是存储在变量 x 中的值? Lisp 假定 x 是一个变量,因此键入 x returns x 的值或产生有关 x 未绑定的错误。在 x 前面加上单引号,如 'x 表示“请不要尝试评估此”。

表单具有一致的格式 (operator data1 data2 data3 ...)。但是,如果您只想提供数据会怎样?你用什么运营商?答案是使用运算符 quote,它将表单计算为数据。因为总是说 quote 很烦人,Lisp 允许你说 '(data1 data2 data3 ...) 代替。

至于'1492,这与Scheme和Common Lisp中的1492是一样的。这些值是可以互换的。我会使用 1492 因为引用是多余的。