【问题标题】:Clojure: how to send remaining arguments "& args" into list?Clojure:如何将剩余的参数“& args”发送到列表中?
【发布时间】:2012-10-20 08:20:35
【问题描述】:

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

(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,...,即没有括号?

【问题讨论】:

    标签: function clojure macros expand args


    【解决方案1】:

    我想你应该使用apply,它将assoc 应用于(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
    

    【讨论】:

    • 为什么reduce 在这里不起作用,但可以与(defn push [v & args] (reduce conj v args)) 一起使用?
    • @spacingissue,我不明白在这种情况下你想如何使用reduce。你能详细说明一下吗?
    • 我想我在想在答案上重复应用 assoc 与 reduce 相同。 push 案例(您在答案上反复应用 conj)有区别吗?
    猜你喜欢
    • 2018-10-21
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 2015-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多