Lisp 申请及;funcall-不同的结果

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个参数 然后在末尾列出一系列参数

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*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)