在 Clojure 中,function/macro 签名中的 `&` 是什么意思?

In Clojure, what does `&` mean in function/macro signature?

我看到 Clojure 函数签名中 & 的用法是这样的 (http://clojure.github.io/core.async/#clojure.core.async/thread):

(thread & body)

还有这个:

(doseq seq-exprs & body)

这是否意味着 function/macro 可以接受列表作为变量?我还发现 * 通常用于表示可以接受多个参数,如下所示:

(do exprs*)

有人知道 function/macro 签名中 &* 之间的区别吗?是否有任何文档来解释此语法?

意思是&后面可以有多个参数,它们会被函数看成一个seq。示例:

(defn g [a & b]
  (println a b))

那么如果你调用:

 (g 1 2 3 4)

会打印出1 (2 3 4)(a为1,b为包含2、3、4的数列)。

在 clojure binding formsletfnloop 及其后代)中,您可以将一个绑定向量的其余部分绑定到一个序列尾随 &。例如,

(let [[a b & xs] (range 5)] xs) ;(2 3 4)

* 的使用和 & 的其他使用是记录参数列表结构的约定。