假设我有一个带有 3 个参数的函数 Foo。例如,Foo 将这 3 个数字相加。
(defun Foo (a b c)
(+ a b c)
Run Code Online (Sandbox Code Playgroud)
然后我就有了这 3 个值的列表。有没有办法解决这个列表,以便每个值都绑定到参数?
(setf list (list 1 2 3))
> (1 2 3)
(Foo (dissolve list))
> 6
Run Code Online (Sandbox Code Playgroud)
我想到的唯一选择是使用宏,但后来我收到错误,@ 不能在反引号之后。
(defmacro dissolve (list)
`,@list)
Run Code Online (Sandbox Code Playgroud)
我知道,答案之一是在 Foo 函数中使用 &rest,但我不想这样做。我只是想知道是否有这样的构造可以从函数外部修复这个问题。
是的,它被称为apply:
(apply #'+ '(1 2 3))
=> 6
Run Code Online (Sandbox Code Playgroud)
你所要求的,(Foo (dissolve list)), 是不可能的,因为 Lisp 的评估规则:Foo是一个函数,并且你的形式传递的正是一个参数。