Sbcl (列表(列表…)

Sbcl (列表(列表…),sbcl,Sbcl,(+35) (八) ((+35)) 为什么第三行的结果与第二行的结果不同?在第二个示例中,(+35),对数字3和5求值,然后将与符号+对应的函数应用于数字3和5,从而对整个表达式求值。(数字会自行计算。这就是为什么在第一个示例中不需要向它们添加”。) 在第一个示例中,Lisp计算'+(结果是符号+)以及3和5,然后将函数list应用于它们,这只不过是创建其(已计算)参数的列表 第三个例子对内部列表做了同样的事情:整个列表都被计算,就像第一个例子一样。这将导致(+35)。然后将函数list的外部实

(+35)

(八)

((+35))


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

在第二个示例中,
(+35)
,对数字3和5求值,然后将与符号
+
对应的函数应用于数字3和5,从而对整个表达式求值。(数字会自行计算。这就是为什么在第一个示例中不需要向它们添加
。)

在第一个示例中,Lisp计算
'+
(结果是符号
+
)以及3和5,然后将函数
list
应用于它们,这只不过是创建其(已计算)参数的列表

第三个例子对内部列表做了同样的事情:整个列表都被计算,就像第一个例子一样。这将导致
(+35)
。然后将函数
list
的外部实例应用于该结果,并在其周围包装另一个列表

与第三个示例不同,您可能希望这样:

(list (list '+ 3 5))
在本例中,
#'
告诉Lisp去获取与
+
相关联的函数。Common Lisp通常以与存储符号的常规值不同的方式存储函数。符号的正常求值得到常规符号值,而求值
#“your-symbol
得到关联函数(如果存在)

然后
funcall
将通过
#“+
获得的函数应用于3和5。然后将该操作的值传递到
列表
,以生成
(8)


(有更精确的方法来说明这一点,但我正试图让初学者了解这些想法。)

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

在第二行中,内部表单(即(+35))计算为8,外部(list)调用创建一个包含1个元素的列表

在第三行中,您有对list的内部调用,该调用将evaluation为3元素list(+35)作为一个值。这不是lisp将进一步计算的表单,您只是创建了一个以symbol+为头的列表。评估外部列表调用将给出另一个1元素列表(其中包含3元素列表作为头)


希望有帮助。

因为代码不同…?请编辑您的问题并将其更改为有意义的标题!
(list (+ 3 5))
(list (list '+ 3 5))
(list (funcall #'+ 3 5))