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