Scheme 为什么';(1 2 3)根据Lisp列表进行评估(方案)?

Scheme 为什么';(1 2 3)根据Lisp列表进行评估(方案)?,scheme,lisp,evaluation,quote,Scheme,Lisp,Evaluation,Quote,quote(”)用于引入预评估值,因此(quote x)产生符号x,而不是符号求值的结果 数字、布尔值、字符和字符串在Scheme中是自评估的,所以引用它们并不重要 但是为什么(quote(1233))或(quote())回答了谓词列表的#t 结果不应该是“预评估”值吗?但在这种情况下,(1 2 3)实际上已被评估为(列表1 2 3) 多谢各位 预评估值 我不知道你从哪里得到这个词的。我从来没用过。这不是“预评估”,而是未评估 事实上,Lisp(和Scheme)的所有工作都是这样的:程序的结构实

quote
)用于引入预评估值,因此
(quote x)
产生符号
x
,而不是符号求值的结果

数字、布尔值、字符和字符串在Scheme中是自评估的,所以引用它们并不重要

但是为什么
(quote(1233))
(quote())
回答了谓词
列表的
#t

结果不应该是“预评估”值吗?但在这种情况下,
(1 2 3)
实际上已被评估为
(列表1 2 3)

多谢各位

预评估值

我不知道你从哪里得到这个词的。我从来没用过。这不是“预评估”,而是未评估

事实上,Lisp(和Scheme)的所有工作都是这样的:程序的结构实际上使用了下面的列表和原子

quote
eval
的对偶:
(eval(list'+'1'2'3))
(由于引号中的数字就是数字,
(eval(list'+1 2'3))
也是
(quote'(+1 2'3))
的反面

已评估的列表是一个调用,因此未评估的调用是一个列表。

结果不应该是“预评估”值吗?但是在这种情况下(1 2 3)实际上已经被评估为(列表1 2 3)

你少了一些括号!你得到的是
(list?(1233))
(或者
(list?(引用1233))
。也就是说,
(list?(1233))
。这是正确的

你可以用
(eval(list'+1 2 3))
检查相反的内容:你得到
6

注意:有些值只对自己求值(如数字或函数)。你可以任意多次抛出
eval
,它不会改变任何东西:
(eval(eval(eval 1))
只是
1

(引号(+1 2 3))
(+1 2 3)
=
(列表“+1 2 3)
(数字是自我评估的,即自我评估)

(eval'(+1 2 3))
(+1 2 3)
6
。和
(eval'(+1 2 3))
(1 2 3)
错误

第一个标识只是语法上的。这里的中心标识是第二个标识,
'(+123)
=
(列表'+'1'2'3)
。它成立,因为所有内容都是在Lisp中计算的,但在此之前,它必须是读的。这意味着,从文本源代码转换为实际的数据结构

由于
(…)
括号表示列表,因此阅读
(…)
表单将创建列表。然后,对引用的表单求值仅返回该表单的原样(即未求值)。令牌
+
被读取为符号
+
;文字
1、2、3
被读取为数字
1、2、3
。因此最终结果与计算表单
(列表'+'1'2'3)
的结果相同

当然,如果没有内部的
+
,所有这些仍然适用。

引用引入了未评估的值,而不是预评估的值,不管这意味着什么

当表达式
(quote X)
被视为要计算的形式时,它只计算为
X
本身。
X
不被视为要计算为值的形式,而是结果值是语法
X
本身

Quote是程序表达的一种方式,“我想使用我自己的一段语法作为一个值”。这正是计算机科学中“文字”的含义:一段程序文本作为运行时值反射回程序中

在Lisp中,除符号以外的原子在计算时表示它们自己。语法
3
计算为整数
3
。它们是一样的:Lisp语法是一个数据结构,在该数据结构中,整数文本
3
已经由它所表示的对象表示

因此,在评估中,
(引号3)
和just
3
“给我语法3本身”和“给我语法3的值”是相同的:只有3

(quote(1 2 3))
下,引用的语法是
(1 2 3)
。该语法是它看起来像的列表对象;quote只是将其返回。如果要计算
(1 2 3)
form,这将是一个错误:它看起来像是
1
被用作运算符或函数,带有参数
2
3
。当
quote
本身被求值时,它会抑制此求值,并按原样生成
(1 2 3)


由于
(1 2 3)
是程序语法的一部分,因此该语言中有一个限制,即不能修改此列表。类似
(inc(car(quote(1 2 3))))
的操作试图将列表更改为
(2 2 3)
调用未定义的行为。从本质上说,程序试图修改自己的语法;如果我们暂时忽略Lisp是一种编译语言这一额外的复杂性,这实际上是一个自修改代码。

编辑:它应该是列表而不是列表?(eval(list+1 2 3))在我的方案中返回一个错误:“异常:无效语法#”您可能需要
(列表'+1 2 3)
。抱歉,我只安装了球拍。假设每个
eval
都删除了
quote
quote
的级别,这是一个“评估障碍”,
eval
是一个评估者。谢谢你,文。我想我理解了。的答案包含了一些很好的解释,说明了
quote
的含义以及它与
列表的关系