ANSI 通用 Lisp。为什么我在最后一种情况下得到另一个答案?
(list 1 2 3 nil) ; (1 2 3 nil)
(funcall (function list) 1 2 3 nil) ; (1 2 3 nil)
(apply (function list) '(1 2 3 nil)) ; (1 2 3 nil)
(apply (function list) 1 2 3 nil) ; (1 2 3)
ANSI 通用 Lisp。为什么我在最后一种情况下得到另一个答案?
(list 1 2 3 nil) ; (1 2 3 nil)
(funcall (function list) 1 2 3 nil) ; (1 2 3 nil)
(apply (function list) '(1 2 3 nil)) ; (1 2 3 nil)
(apply (function list) 1 2 3 nil) ; (1 2 3)
APPLY
期望作为参数:
该函数基本上将被调用,结果为(list* 0-arg ... n-arg argument-list)
请注意,(list* '(1 2 3))
计算结果为(1 2 3)
。
这些参数在 Common Lisp中称为可扩展参数列表。
CL-USER 60 > (apply (function list) 1 2 3 nil)
(1 2 3)
CL-USER 61 > (apply (function list) (list* 1 2 3 nil))
(1 2 3)
CL-USER 62 > (apply (function list) (list* '(1 2 3)))
(1 2 3)
APPLY
通过设计使用这种可扩展的参数列表。例如(... 1 2 3 '(4 5))
. FUNCALL
你必须像往常一样写参数(... 1 2 3 4 5)
:.
APPLY
在 Common Lisp 中只有一个目的:它允许使用计算参数列表调用函数。为了使它更方便一点,我们使用了可扩展参数列表的想法。例如,它在 Emacs Lisp 中的工作方式相同。
想象一下,你有一个参数列表,你想在前面添加两个参数。
CL-USER 64 > (apply '+ args)
60
CL-USER 65 > (apply '+ 1 2 args)
63
CL-USER 66 > (apply '+ (append (list 1 2) args))
63