2012-06-10 20 views
5

Ich bin neu in Clojure und ich bin fest, wie man die optionalen Argumente einer Funktion erweitern, so dass sie an eine andere Funktion gesendet werden können, die optionale Argumente verwendet (aber will diese Args als Schlüsselwörter nicht ein Seq von Keywords).Clojure: Pass 'erweiterte' optionale Argumente zu Funktion

Ich bin Parsen von XML und wenn ich hart Codewerte wie unten meiner Funktion funktioniert, ist es die XML geht und findet den Wert von ‚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) 

Was ich will, ist, Knoten Verwendung tun‘ -path‘in einer beliebigen Anzahl von Schlüsselwörtern passieren, aber wenn, wie unten kommt es in als Folge von Schlüsselwörtern geschrieben, so dass es eine Ausnahme auslöst:

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

dank!

Antwort

8

Ich glaube, Sie suchen gelten (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

Vielleicht Sie wollen:

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

ich kann t t test das oben, so arbeite ich aus analogie:

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

Allerdings, wenn dAni's Lösung funktioniert, ignorier mich!

Verwandte Themen