在Common Lisp中应用:是一次调用的函数,还是列表中每个元素的一次?

时间:2017-10-31 22:51:24

标签: lisp common-lisp

我试图完全理解申请的方式,但找不到足够明确的解释......鉴于此:

http://clhs.lisp.se/Body/26_glo_a.htm#apply

和此:

http://clhs.lisp.se/Body/f_apply.htm

假设我执行以下操作:

(defun sum (L)
  (apply #'+ L))

然后调用以下内容:

(sum '(1 2 3 4 5))

是否执行以下操作:

(+ 1 2 3 4 5)

或以下:

(+ 1 (+ 2 (+ 3 (+ 4 5))))

换句话说,如果我写下面的函数:

(defun sum2 (L)
  (if (null L)
      0
      (+ (first L) (sum2 (rest L)))))

它与上面的函数完全等同吗?

1 个答案:

答案 0 :(得分:6)

(apply #'+ '(1 2 3 4 5))

基本相同
(+ 1 2 3 4 5)

请注意,Common Lisp参数列表的长度通常有限。最大参数列表长度取决于实现,可以低至50.请参见变量call-arguments-limit

如果您想添加更大的数字列表,请使用reduce

(reduce #'+ '(1 2 3 4 5))