(清单(清单......))

时间:2013-03-24 17:15:36

标签: sbcl

(list '+ 3 5)

(+ 3 5)

(list (+ 3 5))

(8)

(list (list '+ 3 5))

((+ 3 5))

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

2 个答案:

答案 0 :(得分: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)。< / p>

(有更精确的方式可以说一些,但我正在尝试将这些想法传达给初学者。)

答案 1 :(得分:0)

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

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

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

希望它有所帮助。