(list '+ 3 5)
(+ 3 5)
(list (+ 3 5))
(8)
(list (list '+ 3 5))
((+ 3 5))
为什么第三行的结果与第二行的结果不同?
答案 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个元素列表作为头部)。
希望它有所帮助。