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