2012-06-10 11 views
5

Sono nuovo di Clojure e sono bloccato su come "espandere" gli argomenti facoltativi di una funzione in modo che possano essere inviati a un'altra funzione che utilizza argomenti opzionali (ma li desidera args come parole chiave non un seq di parole chiave).Clojure: passaggio di argomenti facoltativi "espansi"

sto parsing XML e se I valori del codice duri come sotto la mia funzione funziona, passeggiate xml e trova il valore di '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) 

Quello che voglio fare è utilizzare il nodo ' -path' di passare in qualsiasi numero di parole chiave, ma quando scritto come di seguito viene in come una sequenza di parole chiave in modo viene generata un'eccezione:

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

grazie!

risposta

8

penso che siete in cerca di applicare (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

Forse desideri:

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

posso testare quanto sopra, quindi sto lavorando da analogia:

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

Tuttavia, se dAni di soluzione funziona, ignorami!

Problemi correlati