2012-06-10 9 views
5

Soy nuevo en Clojure y estoy atascado en cómo 'expandir' los argumentos opcionales de una función para que puedan enviarse a otra función que use argumentos opcionales (pero los quiere args como palabras clave, no como una secuencia de palabras clave).Clojure: Pase args opcionales 'expandidos' a la función

Estoy análisis de XML y si los valores de código I duras como a mi función trabaja, camina el xml y encuentra el valor de 'título':

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

Lo que quiero hacer es usar el nodo ' -path' para pasar en cualquier número de palabras clave, pero cuando se escribe como debajo de ella entra como una secuencia de palabras clave de modo que se produce una excepción:

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

gracias!

Respuesta

8

creo que busca aplicar (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

Tal vez usted quiere:

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

que pueda 't prueba lo anterior, entonces estoy trabajando desde la analogía:

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

Sin embargo, si dAni la solución funciona, ignórame!

Cuestiones relacionadas