程序与内置数据

时间:2016-10-17 11:58:06

标签: scheme lisp sicp

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

  • 数字的值是他们命名的数字,
  • 内置运算符的值是执行相应操作的机器指令序列,
  • 其他名称的值是与环境中的这些名称关联的对象。

第二条规定说“内置运算符的值是执行相应操作的机器指令序列。”如果我想更改值,从而更改机器指令,如下所示:

  (define + 2)

  (* + 3) ;6

它工作正常。

现在,第一个案例规定“数字的值是他们命名的数字”。如果我输入

  2

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

  (define 2 +) ;bad syntax

为什么?

2 个答案:

答案 0 :(得分:2)

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

在您的示例中的lisp中,23.1415是文字 - +可能是符号。因此,您可以重新指定符号或名称以指向其他位置。然而,文字总是数据。它们与名称不同。

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

编辑:更一般地说,你评论的是关于"代码是数据"在口齿不清您的示例是此功能的一个不好的示例 - 这是一个涉及语言及其标记的解析器或语法的问题。

更好的例子如下:

(+ 2 3)

此表达式既是可执行语句,也是数据结构。即它可以编码"一个返回5"的函数调用。或者,如果以"为前缀,请不要立即评估我'"对结构

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

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

这是可能的,因为lisps是homoiconic - 源代码既可以作为代码也可以作为数据。

答案 1 :(得分:2)

  

程序和数据在lisp中几乎相同

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

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

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