-2
(list '+ 3 5)

(+ 3 5)

(list (+ 3 5))

(8)

(list (list '+ 3 5))

((+ 3 5))

为什么第三行的结果与第二行的结果不同?

4

2 回答 2

2

在第二个示例中(+ 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)

(有更精确的方式来表达这些,但我试图将这些想法传达给初学者。)

于 2013-04-05T05:11:27.763 回答
0

LIST 是一个从它的参数创建列表的函数。当一个 s 表达式被求值时,Lisp 检查它的第一个元素,如果它是一个函数(LIST 是一个函数),它首先遍历列表中的每个元素,对它们求值并将值作为参数传递给函数。

在第二行中,您将内部形式(即(+ 3 5))评估为 8,外部(list)调用创建一个包含 1 个元素的列表。

在第三行中,您对 list 进行了内部调用,以 3 元素列表 (+ 3 5) 作为值。它不是 lisp 将进一步评估的形式,您刚刚创建了以符号 + 作为头部的列表。评估外部列表调用将给出另一个 1 元素列表(其中包含 3 元素列表作为头部)。

希望能帮助到你。

于 2013-10-07T08:16:23.347 回答