2011-06-29 8 views
9

¿cómo puedo imprimir una lista de n, digamos 10, números en 10 líneas? Acabo de enterarme del bucle y la repetición, pero no puedo combinar un efecto secundario (println i) con (recur (+ i 1)) en forma de bucle. sólo para estar muy claro: me gustaría salida como esta:¿Cómo imprimo una lista de números en cada línea en clojure?

1 
2 
3 
4 
5 
6 
7 
8 
9 
10 

cuando n es 10.

Respuesta

3

Con el lazo/Repetir:

(loop [i 1] 
    (when (<= i 10) 
    (println i) 
    (recur (inc i)))) 

Sin embargo, es más idiomático (leer : más "Clojuristic") a map la función println sobre los números en 1..10. Pero debido mapa devuelve una secuencia perezosa, debe force its evaluation with doall:

(doall (map println (range 1 (inc 10)))) 
+4

De hecho, es más idiomático usar 'doseq' (o' dotimes') en este caso, porque se trata de efectos secundarios. 'map' solo debe usarse si está interesado en el valor de retorno. De lo contrario, serás atrapado fácilmente por la pereza. – kotarak

+0

Eso sería (punto [i 10] (println i)) ¡Gracias! Recordaré eso cuando llegue al capítulo 14 en 'Practical Clojure' (ahora terminando el capítulo 3) :-) – Roger

15

Puede utilizar doseq para esto, que está destinado a ser utilizado cuando iteración implica efectos secundarios,

(doseq [i (range 10)] 
    (println i)) 

Se podría utilizar un mapa como señalado pero que producirá una secuencia llena de nils que no es idiomática y desperdicia recursos, también doseq no es flojo así que no hay necesidad de forzarlo con doall.

+1

Este imprime el número de 0 a 9; utilizando (inc i) en la impresión, como se muestra en las otras respuestas a continuación, da 1 a 10. – Roger

+1

en lugar de inc solo hazlo (rango 1 11) –

0

Y sólo para estar incompleta puede hacerlo con el mapa también:

(doseq (map #(println %) (range 10)) 
9

Sugiero dotimes para este tipo de bucle simple:

(dotimes [i 10] 
    (println (inc i))) 

en cuenta que dotimes es no -Lazy, así que es bueno para cosas como println que causan efectos secundarios.

0

Si sólo desea imprimir la salida en la pantalla, es posible que también se limita a poner (println i) antes de entrar en condicional:

(loop [i 0] 
    (println i) 
    (if (< i 10) 
    (recur (inc i)) 
    (println "done!"))) 

Y la salida habrá un número por línea.

Cuestiones relacionadas