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

spa*_*sue 2 macros expand function clojure args

有没有任何(合理的)方法可以将此宏编写为函数?

(defmacro assocTop
          [v & args]
          `(push (pop ~v)
                 (assoc (peek ~v) ~@args)))
Run Code Online (Sandbox Code Playgroud)

给定地图向量和一些关联,宏代码将关联应用于顶部/查看的地图。

但是,当尝试将其编写为函数时,我无法弄清楚如何~@args以合法的方式扩展。在普通函数中,有没有办法将args,我相信其形式(:a 3 :bb 44 :cd 90,...)变成:a 3 :bb 44 :cd 90,...,即没有括号?

Jan*_*Jan 5

我想你应该使用applywhich will apply assocto(peek v)和expanded 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
Run Code Online (Sandbox Code Playgroud)