2012-06-10 29 views
5

पर कार्य करने के लिए 'विस्तारित' वैकल्पिक तर्क पास करें मैं क्लोजर के लिए नया हूं और मैं फ़ंक्शन के वैकल्पिक तर्कों को 'विस्तारित' करने के तरीके पर फंस गया हूं ताकि उन्हें वैकल्पिक तर्कों का उपयोग करने वाले किसी अन्य फ़ंक्शन पर भेजा जा सके (लेकिन उनको चाहता है कीवर्ड के रूप में तर्क करता है कि कीवर्ड की एक सीमा नहीं है)।क्लोजर:

मैं 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 

हालांकि, अगर डीएनी समाधान काम करता है, मुझे अनदेखा करें!