2012-06-10 62 views
5

我是Clojure的新手,我堅持如何'擴展'一個函數的可選參數,以便它們可以發送到另一個使用可選參數的函數(但希望那些args作爲關鍵字而不是關鍵字的seq)。Clojure:通過'擴展'可選參數功能

我解析XML,如果我硬編碼值如下我的函數的工作原理,它走的XML和發現「標題」的價值:

; 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) 

我想要做的是使用「節點-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) 

的感謝!

回答

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))) 
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解決方案的作品,不理我!