程序与内置数据

procedures vs. built-in data

我试图理解在 lisp 中过程和数据几乎相同的观点。 SICP 说:

第二个规定说 "the values of built-in operators are the machine instruction sequences that carry out the corresponding operations." 如果我想改变值从而改变机器指令,像这样:

  (define + 2)

  (* + 3) ;6

它工作正常。

现在,第一种情况规定"the values of numerals are the numbers that they name"。如果我输入

  2

该值是输出的2的表示。现在,如果我想改变它,像这样:

  (define 2 +) ;bad syntax

这是为什么?

在任何语言定义中,您都需要区分符号(如果有符号)或名称,以及文字(在只有文字的语言中,其中一些代码用于指令,这不是必需的。)

在您示例的 lisp 中,23.1415 是文字 - + 可能是一个符号。因此,您可以重新分配一个符号或名称以指向其他地方是有意义的。然而,文字将永远是数据。它们与名称不同。

您可以定义一种语言,其中文字是,就像 +,符号映射到默认值,如果您愿意,可以重新映射。这种语言的一个例子可能是 C 预处理器。

编辑:更一般地说,您的评论是关于 "code is data" 在 lisp 中的表现。您的示例是此功能的一个错误示例 - 这是一个涉及语言及其标记的解析器或语法的问题。

一个更好的例子如下:

(+ 2 3)

这个表达式既是一个可执行语句,又是一个数据结构。即它可以为 "a function invocation which returns 5" 编码,或者,如果以 "do not evaluate me straight away '" 为前缀,则对结构

(+ . (2 . (3 . NIL)))

这是 lisp 实现中的标准链表结构。您可以在代码中传递此数据结构,稍后使用 EVAL 函数之类的东西执行它,或者(最强大的)编辑它 以便它执行其他操作,然后执行它。

这是可能的,因为 lisp 是 homoiconic - 源代码既作为代码又作为数据。

procedures and data are virtually the same in lisp

事实并非如此。程序就是数据。一种数据。还有其他类型的数据:数字、字符串、cons 单元格、符号、向量...

在Scheme程序中,一个符号就是一个变量。您可以修改变量和值之间的绑定。这就是为什么您可以更改变量 +.

的绑定的原因

但无法更改 2,因为它是数字而不是变量。数字没有约束力。 2 的值已经是 2.