Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scheme 程序与内置数据_Scheme_Lisp_Sicp - Fatal编程技术网

Scheme 程序与内置数据

Scheme 程序与内置数据,scheme,lisp,sicp,Scheme,Lisp,Sicp,我试图理解这样一种观点,即lisp中的过程和数据实际上是相同的。SICP说: 数字的值是它们命名的数字 内置运算符的值是执行相应操作的机器指令序列,以及 其他名称的值是与环境中的这些名称关联的对象 第二条规定是“内置运算符的值是执行相应操作的机器指令序列”。如果我希望更改值从而更改机器指令,如下所示: (define + 2) (* + 3) ;6 (define 2 +) ;bad syntax 它很好用 现在,第一个案例规定“数字的值就是它们命名的数字”。如果我打字

我试图理解这样一种观点,即lisp中的过程和数据实际上是相同的。SICP说:

  • 数字的值是它们命名的数字
  • 内置运算符的值是执行相应操作的机器指令序列,以及
  • 其他名称的值是与环境中的这些名称关联的对象
第二条规定是“内置运算符的值是执行相应操作的机器指令序列”。如果我希望更改值从而更改机器指令,如下所示:

  (define + 2)

  (* + 3) ;6
  (define 2 +) ;bad syntax
它很好用

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

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

  (define + 2)

  (* + 3) ;6
  (define 2 +) ;bad syntax

为什么会这样?

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

在示例中的lisp中,
2
3.1415
是文字-
+
可能是符号。因此,您可以重新指定一个符号或名称以指向其他地方,这是有意义的。然而,文本将始终是数据。它们与名称不同

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

编辑:一般来说,您的评论是关于lisp中“代码是数据”的方式。你的例子是这个特性的一个坏例子——这个问题涉及到语言及其标记的解析器或语法

下面是一个更好的例子:

(+ 2 3)
此表达式既是可执行语句,也是数据结构。也就是说,它可以为“返回
5
”的函数调用编码,或者,如果前缀为“请勿立即对我求值
,则可以为pair结构编码

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


这是可能的,因为LISP是-源代码同时作为代码和数据工作。

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

在示例中的lisp中,
2
3.1415
是文字-
+
可能是符号。因此,您可以重新指定一个符号或名称以指向其他地方,这是有意义的。然而,文本将始终是数据。它们与名称不同

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

编辑:一般来说,您的评论是关于lisp中“代码是数据”的方式。你的例子是这个特性的一个坏例子——这个问题涉及到语言及其标记的解析器或语法

下面是一个更好的例子:

(+ 2 3)
此表达式既是可执行语句,也是数据结构。也就是说,它可以为“返回
5
”的函数调用编码,或者,如果前缀为“请勿立即对我求值
,则可以为pair结构编码

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

这是可能的,因为Lisp是-源代码作为代码和数据工作

lisp中的过程和数据实际上是相同的

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

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

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

lisp中的过程和数据实际上是相同的

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

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


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

那么您能否进一步解释“数字的值就是它们所命名的数字”的含义?我对此感到非常困惑,因为我认为“他们命名的数字”谈论的是数字在更高层的表示。@morbidCode,同一个数字可以通过不同的数字以不同的方式书写。例如,十进制表示法中由2表示的数字也可以由二进制表示法中的数字10表示。两者都表示相同的数字,这是一个抽象实体。当我们非正式地说,或者没有歧义时,我们可以说2是一个数字,但在编程语言中,您可以使用不同的数字系统,例如在许多局域网中