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

标签 lisp common-lisp

假设我有一个带有 3 个参数的函数 Foo。例如,Foo 将这 3 个数字相加。

(defun Foo (a b c) 
  (+ a b c)

然后我就有了这 3 个值的列表。 有没有办法分解这个列表,以便每个值都绑定(bind)到参数?

(setf list (list 1 2 3))
> (1 2 3)
(Foo (dissolve list))
> 6

我想到的唯一选择是使用宏,但后来我收到错误,@ 不能紧接在反引号之后。

(defmacro dissolve (list)
  `,@list)

我知道,答案之一是在 Foo 函数中使用 &rest,但我不想这样做。我只是想知道是否有这样的构造可以从函数外部修复这个问题。

最佳答案

是的,它叫apply :

(apply #'+ '(1 2 3))
=> 6

你所要求的,(Foo (dissolve list)),是不可能的,因为Lisp的评估规则:Foo是一个函数,你的表单传递的是恰好有一个参数。

关于lisp - 如何在 Common Lisp 中分解或拼接列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74141572/

相关文章:

common-lisp - 分别询问 idomatic 方式以避免代码重复

types - 字段计算为值 (0.0),不是 SHORT-FLOAT 类型

lambda - 使用函数中的 lambda 值作为列表的第一个元素

clojure - Clojure 和 Lisp 之间有很大的语法差异吗

scheme - 列表和数字之间的最小值

lisp - 如何从 REPL 获得离线 CLHS?

lisp - 在 Lisp 中,+ 函数实际上可以有多少个输入?

javascript - 事件/异步语言列表

lisp - 代码抛出错误 : Space is an illegal character after a colon.

lisp - 在 Lisp 中计算平均绩点和类(class)平均水平