2011-06-01 37 views
11

estoy aprendiendo Clojure y no tengo duda:error extraño cuando se trata de asignar parseInt en Clojure

Por qué cuando escribo

(map vector '("1" "2" "3")) 

consigo (["1"] ["2"] ["3"])

Está bien porque vector es una función (o casi lo creo), y puedo hacer (vector "3") y obtener ["3"].

Hasta aquí todo bien, pero cuando intento

(map Integer/parseInt '("1" "2" "3")) 

Me aparece un error. ¿No debería parseInt comportarse como una función?

entonces necesito para escribir

(map #(Integer/parseInt %) '(...... 

Por qué no puedo usar parseInt como una función? Para mí es una función, y puede usarlo como

(Integer/parseInt "3") 

me siento un poco incoherente, pero estoy seguro de que estoy haciendo algún error y es por esto que te pido ...

+0

posible duplicado de [Convertir una secuencia de cadenas a números enteros (Clojure)] (http : //stackoverflow.com/questions/4714923/convert-a-sequence-of-strings-to-integers-clojure) – amalloy

Respuesta

16

Tienes que envolverlo en #() o (fn ...). Esto se debe a que Integer/parseInt es un método de Java y los métodos de Java no se pueden pasar. No implementan la interfaz IFn.

Clojure está basado en Java y, a veces, se filtra, y este es uno de esos casos.

+0

muchas gracias ... ahora está claro para mí: D – coco

4

Como otros han dicho, es necesario para envolver Entero/parseInt con el fin de convertirlo de un método Java en una función Clojure:

(map #(Integer/parseInt %) '("1" "2" "3")) 

La razón de esto es que las funciones de Clojure deben implementar la interfaz IFn para pasarlos como argumentos a funciones de orden superior como map.

Esto es un poco feo si usted está haciendo este tipo de conversión muchas veces, así que recomiendo envolver su función de análisis-int de la siguiente manera:

(defn parse-int [s] (Integer/parseInt s)) 

(map parse-int '("1" "2" "3")) 

Como última alternativa, es posible que desee utilizar la función de cuerdas leer incorporado - esto devolverá enteros en su caso, pero también trabajaría en dobles etc .:

(map read-string '("1" "2" "3")) 
+0

muchas gracias ... ahora está claro para mí: D – coco

Cuestiones relacionadas