在 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 forms(let
、fn
、loop
及其后代)中,您可以将一个绑定向量的其余部分绑定到一个序列尾随 &
。例如,
(let [[a b & xs] (range 5)] xs) ;(2 3 4)
*
的使用和 &
的其他使用是记录参数列表结构的约定。
我看到 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 forms(let
、fn
、loop
及其后代)中,您可以将一个绑定向量的其余部分绑定到一个序列尾随 &
。例如,
(let [[a b & xs] (range 5)] xs) ;(2 3 4)
*
的使用和 &
的其他使用是记录参数列表结构的约定。