lisp - apply & funcall - 不同的结果

标签 lisp common-lisp clisp ansi-common-lisp

ANSI 通用语言。 为什么我在最后一个案例中得到了其他答案?

(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 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

关于lisp - apply & funcall - 不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21023034/

相关文章:

common-lisp - 避免在 lisp 中实现 OR 宏函数的副作用

common-lisp - 如何更改 aif 以能够在宏调用中访问 'it' 而无需在包中公开 'it'

macros - 在宏中写入 `loop ... collect` 时出现问题

lisp - 如何写一个clisp可执行文件?

ruby - 树顶语法问题,不匹配所有选项

scheme - 如何在 Breakout 中让球与砖 block 碰撞( Racket )

eclipse - 什么是适合 Lisp 的 "rich"IDE?

lisp - 在 CLISP 中列出目录

recursion - 让递归调用多次

lisp - CLISP 的 REPL 中有哪些魔法变量?