2011-01-17 19 views
26

Actualmente estoy teniendo un problema donde tengo que leer un archivo de texto desde la línea de comandos que contiene al menos un número entero. Estoy leyendo el archivo, haciendo una coincidencia de expresión regular para ignorar el espacio en blanco.Convertir una secuencia de cadenas en enteros (Clojure)

(re-seq #"[0-9]+" (slurp (first *command-line-args*))) 

Después de esto tengo que escribir toda una función para convertir esta secuencia de cadenas en una secuencia de enteros. Aparentemente no puedo mapear Integer. a la secuencia (a menos que esté usando el mapa incorrectamente).

¿Hay alguna manera elegante de manejar esto, algo similar al mapa? ¿O tengo que ir a través de un salto recursivo primero y enviarlo al Integer. para que funcione?

Actualmente estoy aprendiendo Clojure, y mientras aprendo fragmentos vuelvo y hago pequeñas pruebas de programador, utilizo otros idiomas.

Respuesta

45

Está buscando Integer/parseInt.

user=> (map #(Integer/parseInt %) ["1" "2" "3" "4"]) 
(1 2 3 4) 

Tienes que envuelva Integer/parseInt en una función anónima debido a los métodos de Java no son funciones.

read-string también funcionaría en este caso:

user=> (map read-string ["1" "2" "3" "4"]) 
(1 2 3 4) 

read-string lee cualquier objeto de una cadena, no sólo los números enteros. Entonces, si hicieras (read-string "1.0"), obtendrías una doble. Cuando lee de fuentes externas, generalmente es mejor limitar lo que se puede leer exactamente lo que necesita, que es un número entero en este caso. Por lo tanto, recomiendo usar mi primer ejemplo.

+0

¡Ah, eso funciona! ¡Gracias! –

+2

+1 No tenía idea acerca de la cadena de lectura, pero sabía que debe haber algo así como – twneale

+1

Esto funciona muy bien, pero solo cuando clojure se ejecuta en la JVM. ClojureCLR no es –

Cuestiones relacionadas