我在Clojure函数签名中看到&
的使用情况如此(http://clojure.github.io/core.async/#clojure.core.async/thread):
(thread & body)
而且:
(doseq seq-exprs & body)
这是否意味着函数/宏可以接受列表作为变量?我还发现*
经常被用来表示可以接受多个参数,如下所示:
(do exprs*)
有没有人对功能/宏签名中&
和*
之间的区别有什么想法?有没有文件可以解释这种语法?
答案 0 :(得分:8)
在clojure binding forms(let
,fn
,loop
及其后代)中,您可以将绑定向量的其余部分绑定到具有尾随的序列{ {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的序列)。