2011-02-07 15 views
21

Ho scritto una piccola funzione anonima da utilizzare con una chiamata map. La funzione restituisce un vettore contenente un nome di colonna e un valore di colonna da una query del set di risultati SQL.Clojure: restituire un vettore da una funzione anonima

Ecco la funzione (input è il nome della colonna):

(fn [name] [(keyword name) (.getObject resultset name)]) 

Questo funziona bene, ma quando ho provato a usare una versione "semplificata" della funzione anonima, ho ottenuto un errore:

#([(keyword %) (.getObject resultset %)]) 

java.lang.IllegalArgumentException: Wrong number of args (0) passed to: PersistentVector 

Ecco la map chiamata:

(into {} (map (fn [name] [(keyword name) (.getObject resultset name)]) column-names)) 

E 'possibile utilizzare il simpl sintassi ified per questa funzione? Se é cosi, come?

Grazie.

+0

Qualche informazione in più: http://groups.google.com/group/clojure/browse_thread/thread/9037f31748cef0e2/62d3f3a45a139157?lnk=gst&q= Nick + Zbinden # 62d3f3a45a139157 – nickik

risposta

24

Il tuo problema è che la semplice sintassi sta cercando di valutare il vettore come una chiamata di funzione.

È possibile inserire una funzione di "identità" per farlo funzionare, in quanto questo è solo una semplice funzione che restituirà il vettore invariato:

#(identity [(keyword %) (.getObject resultset %)]) 
+0

Ho scelto questa risposta perché spiega anche perché il problema si verifica, anche se la risposta di Alex Ott funziona anche (e fornisce una soluzione generale per altre strutture dati). Ringrazia tutti. – Ralph

+0

Ho modificato questa risposta per incorporare il suggerimento di Alex, ma sembra che sia stato ignorato per qualche motivo. Oh bene. – apg

+0

Ho aggiunto un esempio della soluzione più ideale piuttosto che la semplice visualizzazione del codice che dimostra il motivo per cui non funzionava. Poiché la modifica non è stata eseguita. – Psyllo

23

È necessario utilizzare vettore funzione per fare questo:

#(vector (keyword %) (.getObject resultset %)) 

PS ci sono anche funzioni per mappe, insiemi, ecc.

4

Sì, Clojure dovrebbe davvero supportare un costrutto # [...], solo per questo caso.

mi sento di raccomandare il seguente come la migliore alternativa:

#(vector (keyword %) (.getObject resultset %)) 
+2

Non penso che # [...] sia abbastanza comune da meritare una sintassi speciale per questo, e una volta che lo apprendi, lanciare 'vector' dentro non è un grosso problema. – apg

+0

Ho pensato allo stesso costrutto '# [...]'. Come potrei scrivere una macro per questo? # significa macro lettore? –

+0

Puoi scrivere '# (-> [(keyword%) (.getObject resultset%)])', ma trovo questo poco chiaro –

Problemi correlati