【问题标题】:Clojure: Pass 'expanded' optional args to functionClojure:将“扩展”可选参数传递给函数
【发布时间】:2012-06-10 22:23:29
【问题描述】:

我是 Clojure 的新手,我一直纠结于如何“扩展”函数的可选参数,以便可以将它们发送到另一个使用可选参数的函数(但希望这些参数作为关键字而不是关键字序列)。

我正在解析 xml,如果我硬编码值如下,我的函数可以正常工作,它会遍历 xml 并找到 'title' 的值:

; zd was required like this
[clojure.data.zip.xml :as zd]
; ...
(defn get-node-value [parsed-xml & node-path]
  (zd/xml-> (zip/xml-zip parsed-xml) :item :title zd/text))

(get-node-value parsed-xml)

我想要做的是使用'node-path'来传递任意数量的关键字,但是当写成如下时,它作为一个关键字序列出现,所以它会抛出一个异常:

(defn get-node-value [parsed-xml & node-path]
  (zd/xml-> (zip/xml-zip parsed-xml) node-path zd/text))

(get-node-value parsed-xml :item :title)
; ClassCastException clojure.lang.ArraySeq cannot be cast to clojure.lang.IFn  clojure.data.zip/fixup-apply (zip.clj:73)

谢谢!

【问题讨论】:

    标签: clojure arguments sequence keyword optional


    【解决方案1】:

    我认为您正在寻找申请 (http://clojuredocs.org/clojure_core/clojure.core/apply)

    (defn get-node-value [parsed-xml & node-path]
      (let [params (concat node-path [zd/text])]
        (apply zd/xml-> (zip/xml-zip parsed-xml) params)))
    

    【讨论】:

      【解决方案2】:

      也许你想要:

      (defn get-node-value [parsed-xml & node-path]
        (zd/xml-> (zip/xml-zip parsed-xml) ((apply comp (reverse node-path))) zd/text))
      

      我无法测试上述内容,所以我在类比工作:

      (-> {:a {:c 1}, :b 2} ((apply comp (reverse [:a :c]))))
      1
      

      但是,如果 dAni 的解决方案有效,请忽略我!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-11-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多