(list '+ 3 5)
(+ 3 5)
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
为什么第三行的结果与第二行的结果不同?
(list '+ 3 5)
(+ 3 5)
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
为什么第三行的结果与第二行的结果不同?
在第二个示例中(+ 3 5)
,计算数字 3 和 5,然后通过将对应于符号 的函数应用于数字 3 和 5 来计算整个表达式+
。(数字对自己进行计算。这就是为什么你不需要'
在第一个示例中添加它们。)
在第一个示例中,Lisp 计算'+
(产生符号+
)以及 3 和 5,然后将函数list
应用于它们,这只不过是创建一个(计算的)参数列表。
第三个示例对内部列表执行相同的操作:评估整个内容,就像在第一个示例中一样。这导致(+ 3 5)
. 然后将函数的外部实例list
应用于此结果,并在其周围包装另一个列表。
而不是第三个例子,也许你想要这个:
(list (funcall #'+ 3 5))
在这种情况下,#'
告诉 Lisp 去获取与+
. Common Lisp 通常以与存储符号的常规值不同的方式存储函数。符号的正常求值获得常规符号值,而求值#'your-symbol
获得关联的函数(如果存在)。
然后funcall
将获得的函数应用于#'+
3 和 5。然后将该操作的值传递给list
, 以生成(8)
。
(有更精确的方式来表达这些,但我试图将这些想法传达给初学者。)
LIST 是一个从它的参数创建列表的函数。当一个 s 表达式被求值时,Lisp 检查它的第一个元素,如果它是一个函数(LIST 是一个函数),它首先遍历列表中的每个元素,对它们求值并将值作为参数传递给函数。
在第二行中,您将内部形式(即(+ 3 5))评估为 8,外部(list)调用创建一个包含 1 个元素的列表。
在第三行中,您对 list 进行了内部调用,以 3 元素列表 (+ 3 5) 作为值。它不是 lisp 将进一步评估的形式,您刚刚创建了以符号 + 作为头部的列表。评估外部列表调用将给出另一个 1 元素列表(其中包含 3 元素列表作为头部)。
希望能帮助到你。