Clojure:如何将剩余的参数“& args”发送到列表中?

时间:2012-10-20 08:20:36

标签: function clojure macros expand args

有没有(合理的)方法将此宏写为函数?

(defmacro assocTop
          [v & args]
          `(push (pop ~v)
                 (assoc (peek ~v) ~@args)))

给定一个地图矢量和一些关联,宏代码将关联应用于顶部/窥视地图。

但是,在尝试将其作为函数编写时,我无法弄清楚如何以合法的方式扩展~@args。在正常函数中,有没有办法将args转换为(:a 3 :bb 44 :cd 90,...),我认为:a 3 :bb 44 :cd 90,...形式为{{1}}。没有parens?

1 个答案:

答案 0 :(得分:4)

我猜您应该使用applyassoc(peek v)应用于args并展开(defn assocTop [v & args] (push (pop v) (apply assoc (peek v) args))) (= (assocTop [{:a :b} {:c :d} {:e :f, :g :h}] :e :z) [{:a :b} {:c :d} {:g :h, :e :z}]) ; => true

{{1}}