我遇到了一个问题,即我不确定我到目前为止在Lisp上学到的一切是否正确。
基本上,这项任务很简单:创建一个仅包含单个项目(T
文字)的列表。
我的第一种方法是:
'(t)
这样对吗?基本上,它评估为
(T)
这似乎是正确的。随着符号T
对自身的求值,这应该可以完成工作。但是后来让我开始想...如果我写
'(s)
我得到:
(S)
这看起来几乎相同,但应该以不同的方式进行评估。所以我想到了
(list t)
这也导致:
(T)
如果我使用符号eq
相等来比较符号:
(eq (car (list t)) (car '(t)))
而且如果II将两个值T
直接比较,一切都很好:
(eq (car (list t)) t)
(eq (car '(t)) t)
因此,简而言之:'(t)
这项工作对吗?
我认为您不完全了解评估。
现在我们来看一下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
。
因此,差异归结为常量数据与函数创建的数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句