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)
和just3
“给我语法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
的含义以及它与列表的关系