0

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$也是原子。

所有这些 except1492必须在前面加上'- 否则我们会得到一个Error: execute: unbound symbol:

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

4

1 回答 1

1

原子。原子是不可分割的东西。像13or一样的值72是不可分割的,它是一个单一的值。还有其他原子,一个类似于 的字符串,一个类似于or"hello"的变量,一个类似于xory的值。:keyword'something

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

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

然后有几个问题。对于初学者,x我们是指 atom 'x,一个名为 的变量x,还是存储在变量中的值x?Lisp 假定它x是一个变量,因此键入x返回的值x或产生关于x未绑定的错误。在 , 前面加上一个单引号x'x表示“请不要试图评估这个”。

表格具有一致的格式(operator data1 data2 data3 ...)。但是,如果您只想提供数据会发生什么?你用什么运算符?答案是使用 operator quote,它将表单评估为仅数据。因为一直说引号很烦人,所以 Lisp 允许您改为说引号'(data1 data2 data3 ...)

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

于 2021-12-11T21:21:22.083 回答