创建一个包含T作为单个元素的列表

Gol*_*den 7 lisp common-lisp

我遇到了一个问题,我不确定我是否把一切都做对了,到目前为止我在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)做好工作,不是吗?

Rai*_*wig 8

我不认为你完全理解评价.

我们现在看一下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.

因此,差异归结为恒定数据与函数创建的数据.

  • @Svante:通常不在Common Lisp中.在文件编译下,有些情况下文字对象不是这种情况.例如,您有源代码使用两个列表(1 2 3).列表可以是EQ,也可以不是.在一种情况下,读者可能会阅读一些内容,而这些内容并未在代码中结束.还想象一下,读者在一个编译代码的Lisp和运行编译代码的另一个Lisp中运行. (2认同)