Lisp 申请及;funcall-不同的结果
ANSI通用Lisp。 为什么我在最后一个案例中得到了另一个答案Lisp 申请及;funcall-不同的结果,lisp,common-lisp,clisp,ansi-common-lisp,Lisp,Common Lisp,Clisp,Ansi Common Lisp,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期望作为参数: 函数 零。。。n个参数 然后在末尾列出一系列参数
(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
期望作为参数:
- 函数
- 零。。。n个参数
- 然后在末尾列出一系列参数
(list*0-arg…n-arg参数列表)的结果调用的。
请注意,(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
谢谢,但我还是不明白:为什么在最后一个案例中,我没有得到列表末尾的“无”项?我是ANSI Common Lisp的初学者,现在正在读Paul Graham的书。@bush:最后一个例子:NIL是空列表<代码>(列表*123NIL)正在向空列表添加1、2、3。因此
(1 2 3)
。