我遇到了一个问题,我不确定我到目前为止在Lisp上学到的东西是否正确。
基本上,任务很简单:创建一个只包含单个项目的列表 - T
文字。
我的第一个方法是:
'(t)
这是对的吗?基本上,它评估为
(T)
这似乎是正确的。当符号T
对自身进行评估时,这应该可以胜任。但后来它让我思考......如果我写的话
'(s)
我明白了:
(S)
这看起来几乎相同,但应以不同的方式进行评估。所以我想到了
(list t)
也导致:
(T)
如果我使用eq
比较符号,则它们是相等的:
(eq (car (list t)) (car '(t)))
如果我直接将这两个值与T
进行比较,一切都很好:
(eq (car (list t)) t)
(eq (car '(t)) t)
所以,简而言之:'(t)
完成工作,不是吗?
答案 0 :(得分:8)
我认为你并不完全理解评估。
我们现在看一下Lisp代码。这意味着编程语言的源代码。不是s表达式:
'(t)
以上与:
相同(quote (t))
如果我们评估它,Lisp会看到QUOTE
特殊运算符。 QUOTE
会阻止评估所附表单并将其返回。
因此结果为(T)
。 T
永远不会被评估。 (T)
永远不会被评估。 (T)
是一个常量字面列表。
如果你写'(s)
或'(sin)
或其他任何符号,都没关系。它始终是一个符号的常量文字列表。
再次编码:
(list t)
这是一个功能应用程序。评估时:
Lisp看到一个以LIST
为功能的列表。
它评估参数。 T
会自行评估。
它使用参数LIST
调用T
。
函数LIST
返回一个新的列表:(T)
。
之间有什么区别
(defun foo ()
'(t))
和
(defun bar ()
(list t))
FOO
返回嵌入代码中的常量文字列表。
BAR
在运行时调用LIST
,每次返回一个新列表。
两个列表都包含相同的符号:T
。
因此,差异归结为常量数据与函数创建的数据。