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

时间:2015-04-15 07:40:54

标签: lisp common-lisp

我遇到了一个问题,我不确定我到目前为止在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)完成工作,不是吗?

1 个答案:

答案 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

因此,差异归结为常量数据与函数创建的数据。