如何在 Common Lisp 中分解或拼接列表?

MRm*_*lub 2 lisp common-lisp

假设我有一个带有 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,但我不想这样做。我只是想知道是否有这样的构造可以从函数外部修复这个问题。

sds*_*sds 5

是的,它被称为apply

(apply #'+ '(1 2 3))
=> 6
Run Code Online (Sandbox Code Playgroud)

你所要求的,(Foo (dissolve list)), 是不可能的,因为 Lisp 的评估规则:Foo是一个函数,并且你的形式传递的正是一个参数。