在Clojure中,“&”在函数/宏签名中意味着什么?

时间:2016-02-15 15:20:51

标签: clojure macros lisp

我在Clojure函数签名中看到&的使用情况如此(http://clojure.github.io/core.async/#clojure.core.async/thread):

(thread & body)

而且:

(doseq seq-exprs & body)

这是否意味着函数/宏可以接受列表作为变量?我还发现*经常被用来表示可以接受多个参数,如下所示:

(do exprs*)

有没有人对功能/宏签名中&*之间的区别有什么想法?有没有文件可以解释这种语法?

2 个答案:

答案 0 :(得分:8)

在clojure binding formsletfnloop及其后代)中,您可以将绑定向量的其余部分绑定到具有尾随的序列{ {1}}。例如,

&

(let [[a b & xs] (range 5)] xs) ;(2 3 4) 的使用和*的其他用法是用于记录参数列表结构的约定。

答案 1 :(得分:5)

这意味着&符号后面可以有多个参数,它们将被函数看作seq。例如:

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

然后,如果你打电话:

 (g 1 2 3 4)

它将打印出1 (2 3 4)(a为1,b为包含2,3和4的序列)。