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

Lisp 创建包含T作为单个元素的列表,lisp,common-lisp,Lisp,Common Lisp,我遇到了一个问题,我不确定到目前为止我在Lisp上学到的东西是否都对了 基本上,这项任务很简单:创建一个只包含一个项目的列表—Tliteral 我的第一个方法是: '(t) 这是正确的吗?基本上,它评估为 (T) 这似乎是正确的。由于符号T的计算结果是自身的,所以这应该可以完成工作。但这让我想…如果我写 '(s) 我得到: (S) 这看起来几乎一样,但应该以不同的方式进行评估。所以我想 (list t) 这也导致: (T) 如果我使用eq比较符号,它们相等: (eq (car (li

我遇到了一个问题,我不确定到目前为止我在Lisp上学到的东西是否都对了

基本上,这项任务很简单:创建一个只包含一个项目的列表—
T
literal

我的第一个方法是:

'(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
特殊操作符<代码>报价阻止对所附表单进行求值并返回该表单

因此,结果是
(T)
T
永远不会得到评估<代码>(T)永远不会得到评估
(T)
是一个常量文本列表

如果你写的是
'(s)
'(sin)
或任何其他符号,这都无关紧要。它始终是一个由一个符号组成的常量文字列表

再次编码:

(list t)
这是一个函数应用程序。评估时:

  • Lisp将带有
    list
    的列表视为一个函数

  • 它评估参数
    T
    对其自身进行计算

  • 它使用参数
    T
    调用
    LIST

  • 函数
    LIST
    返回一个新列表:
    (T)

两者的区别是什么

(defun foo ()
  '(t))

?

FOO
返回嵌入在代码中的常量文本列表

BAR
在运行时调用
LIST
,每次它都返回一个新列表

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


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

很好的解释,谢谢:-)。我仍然经常不考虑引用的含义……除此之外,常量数据与函数创建的数据的对比提示非常有用。谢谢引用意味着使用的正是读者返回的内容。@Svante:一般不在Common Lisp中。在文件编译中,有些情况下文字对象不是这样。例如,您有使用两个列表(1 2 3)的源代码。列表可以是相等的,也可以不是相等的。在一种情况下,读者可能会阅读一些不在代码中的内容。再想象一下,读者在一个Lisp中运行,其中代码被编译,而在另一个Lisp中加载编译后的代码。@RainerJoswig:这的确是一个很好的解释。不过,我想指出一件事。您的
foo
示例不返回常量。这是一个陷阱,初学者经常被抓住。试试这个:
(defun foo()'(t))(nconc(foo);(abc))(foo)
@andwagin:从概念上讲,它是一个常量。更改它的影响尚未定义。在标准中。它可能在某个只读内存中,它可能会导致发出错误信号,它可能会被忽略,它可能会在多个地方共享。。。因为发生的事情还没有定义,所以在可移植代码中实际更改它是没有意义的。。。
(defun bar ()
  (list t))