程序与内置数据
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 中,2
和 3.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
.
我试图理解在 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 中,2
和 3.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
.