【问题标题】:In Clojure, what does `&` mean in function/macro signature?在 Clojure 中,函数/宏签名中的“&”是什么意思?
【发布时间】:2016-02-15 15:20:50
【问题描述】:

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

(thread & body)

还有这个:

(doseq seq-exprs & body)

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

(do exprs*)

有人知道&* 在函数/宏签名中的区别吗?是否有任何文档可以解释这种语法?

【问题讨论】:

    标签: clojure macros lisp


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      表示“&”号后面可以有多个参数,函数会将它们视为一个seq。示例:

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

      如果你打电话:

       (g 1 2 3 4)
      

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

      【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 2013-01-04
      • 1970-01-01
      • 2010-09-29
      • 2018-02-06
      相关资源
      最近更新 更多