创建一个包含 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
。
因此,差异归结为 常量数据 与函数创建的数据。
我遇到了一个问题,我不确定到目前为止我在 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
。
因此,差异归结为 常量数据 与函数创建的数据。