我试图理解在lisp中程序和数据几乎相同的观点。 SICP说:
第二条规定说“内置运算符的值是执行相应操作的机器指令序列。”如果我想更改值,从而更改机器指令,如下所示:
(define + 2)
(* + 3) ;6
它工作正常。
现在,第一个案例规定“数字的值是他们命名的数字”。如果我输入
2
该值是输出的2的表示。现在,如果我想改变它,就像这样:
(define 2 +) ;bad syntax
为什么?
答案 0 :(得分:2)
在语言的任何定义中,您需要区分符号(如果有符号)或名称,以及文字(在只有文字的语言中,其中一些代码用于指令,这不是必需的。)
在您的示例中的lisp中,2
和3.1415
是文字 - +
可能是符号。因此,您可以重新指定符号或名称以指向其他位置。然而,文字总是数据。它们与名称不同。
您可以定义文字所在的语言,就像+
一样,符号映射到默认值,如果您愿意,可以重新映射。这种语言的一个例子可能是C预处理器。
编辑:更一般地说,你评论的是关于"代码是数据"在口齿不清您的示例是此功能的一个不好的示例 - 这是一个涉及语言及其标记的解析器或语法的问题。
更好的例子如下:
(+ 2 3)
此表达式既是可执行语句,也是和数据结构。即它可以编码"一个返回5
"的函数调用。或者,如果以"为前缀,请不要立即评估我'
"对结构
(+ . (2 . (3 . NIL)))
这是lisp实现中的标准链表结构。您可以在代码中传递此数据结构,稍后使用EVAL
函数执行它,或者(最强大的)编辑它以便它执行其他操作然后执行它。
这是可能的,因为lisps是homoiconic - 源代码既可以作为代码也可以作为数据。
答案 1 :(得分:2)
程序和数据在lisp中几乎相同
事实并非如此。程序就是数据。一种数据。还有其他类型的数据:数字,字符串,缺点单元格,符号,向量,......
在Scheme程序中,符号是变量。您可以修改变量和值之间的绑定。这就是为什么你可以改变变量+
的绑定。
但是无法更改2
,因为它是一个数字而不是变量。一个数字没有约束力。 2
的值已经为2
。