Clojure:通过'扩展'可选的args来运行

时间:2012-06-10 22:23:29

标签: clojure arguments sequence keyword optional

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

我正在解析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)

谢谢!

2 个答案:

答案 0 :(得分:8)

我认为您正在寻找申请(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)))

答案 1 :(得分:3)

也许你想要:

(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的解决方案有效,请忽略我!