2011-02-07 15 views
21

Escribí una pequeña función anónima para ser utilizada con una llamada map. La función devuelve un vector que contiene un nombre de columna y un valor de columna de una consulta de conjunto de resultados de SQL.Clojure: devolver un vector de una función anónima

Aquí es la función (de entrada es el nombre de la columna):

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

Esto funciona bien, sin embargo, cuando traté de usar una versión "simplificada" de la función anónima, tengo un error:

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

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

Aquí es el map llamada:

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

¿es posible utilizar el sencillo, sintaxis ified para esta función? ¿Si es así, cómo?

Gracias.

+0

Algunos más información: http://groups.google.com/group/clojure/browse_thread/thread/9037f31748cef0e2/62d3f3a45a139157?lnk=gst&q= Nick + Zbinden # 62d3f3a45a139157 – nickik

Respuesta

24

Su problema es que la sintaxis simple está tratando de evaluar el vector como una llamada a función.

Puede insertar una función de "identidad" para hacer que funcione, ya que esto es sólo una simple función que devolverá el vector sin cambios:

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

Elegí esta respuesta porque también explica por qué ocurre el problema, aunque la respuesta de Alex Ott también funciona (y proporciona una solución general para otras estructuras de datos). Gracias a todos. – Ralph

+0

Edité esta respuesta para incorporar la sugerencia de Alex, pero parece que la ignoraron por algún motivo. Oh bien. – apg

+0

Agregué un ejemplo de la solución más ideal en lugar de solo mostrar el código que demuestra por qué no funcionaba. Ya que editar no tomó. – Psyllo

23

Es necesario utilizar vector función para hacer esto:

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

PS también hay funciones para mapas, conjuntos, etc.

4

Sí, Clojure realmente debería admitir una construcción [...] #, solo para este caso.

recomendaría lo siguiente como la mejor alternativa:

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

No creo que [...] sea lo suficientemente común como para justificar la sintaxis especial para él, y una vez que aprendas al respecto, arrojar 'vector' allí no es un gran problema. – apg

+0

Pensé en la misma construcción '# [...]'. ¿Cómo podría escribir una macro para eso? # significa lector macro ¿verdad? –

+0

Puedes escribir '# (-> [(keyword%) (.getObject resultset%)])', pero esto no me parece claro –

Cuestiones relacionadas