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

Han*_*Sun 3 lisp macros clojure

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

(thread & body)
Run Code Online (Sandbox Code Playgroud)

还有这个:

(doseq seq-exprs & body)
Run Code Online (Sandbox Code Playgroud)

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

(do exprs*)
Run Code Online (Sandbox Code Playgroud)

有没有人有之间的差异的想法&,并*在功能/宏特征?有没有文档可以解释这种语法?

Thu*_*ail 8

Clojure中结合形式(let,fn,loop,和它们的后代),可以结合矢量的其余部分结合于具有拖曳的序列&.例如,

(let [[a b & xs] (range 5)] xs) ;(2 3 4)
Run Code Online (Sandbox Code Playgroud)

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


Die*_*sch 5

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

(defn g [a & b]
  (println a b))
Run Code Online (Sandbox Code Playgroud)

如果你打电话:

 (g 1 2 3 4)
Run Code Online (Sandbox Code Playgroud)

它会打印出来1 (2 3 4)(a是1,b是包含2,3和4的序列).

  • 哦,那么它就像 JavaScript 中的 `...rest` 参数?https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/rest_parameters (2认同)