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

Create a list that contains T as single element

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

我认为你没有完全理解评估。

我们现在来看 Lisp 代码。这意味着编程语言的源代码。不是 S 表达式:

'(t)

上同:

(quote (t))

如果我们评估它,Lisp 会看到 QUOTE 特殊运算符。 QUOTE 阻止计算所附表格和 returns 它。

因此结果是(T)T 永远不会被评估。 (T) 永远不会被评估。 (T) 是常量文字列表。

如果你写'(s)'(sin)或任何其他符号,都没有关系。它始终是一个符号的常量文字列表。

再次编码:

(list t)

这是一个函数应用程序。评价时:

  • Lisp 将带有 LIST 的列表视为函数。

  • 它计算参数。 T 被评估为自身。

  • 它用参数 T 调用 LIST

  • 函数 LIST returns 一个新列表:(T).

有什么区别

(defun foo ()
  '(t))

(defun bar ()
  (list t))

?

FOO returns 常量文字列表,嵌入代码中。

BAR 在运行时调用 LIST 并且每次 returns 一个新列表。

两个列表包含相同的符号:T

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