Как напечатать список чисел в каждой строке в clojure? - PullRequest
9 голосов
/ 29 июня 2011

как мне распечатать список из n, скажем, 10, чисел в 10 строк?Я только что узнал о цикле и повторении, но не могу объединить побочный эффект (println i) с (recur (+ i 1)) в форме цикла.Просто чтобы быть предельно ясным: я хотел бы вывод, как это:

1
2
3
4
5
6
7
8
9
10

, когда n равно 10.

Ответы [ 5 ]

15 голосов
/ 29 июня 2011

Для этого вы можете использовать дозаq, который должен использоваться, когда итерация сопряжена с побочными эффектами,

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

Вы можете использовать карту как указано, но она будет производить последовательность, полную нулей, которая не является идиоматической и тратит ресурсы, а также доза не ленива, поэтому нет необходимости форсировать ее с помощью doall.

10 голосов
/ 29 июня 2011

Я предлагаю dotimes для этого вида простого цикла:

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

Обратите внимание, что dotimes не ленив, поэтому хорошо для таких вещей, как println, которые вызывают побочные эффекты.

3 голосов
/ 29 июня 2011

С циклом / рекуррент:

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

Однако, это более идиоматично (читай: больше "Clojuristic") для map функция println над числами в 1..10 Но поскольку карта возвращает ленивую последовательность, вы должны форсировать ее оценку с помощью doall :

(doall (map println (range 1 (inc 10))))
0 голосов
/ 17 июля 2015

Если вы хотите распечатать вывод на экране, вы также можете просто поставить (println i) перед вводом вашего условия:

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

И вывод будет одним числом в строке.

0 голосов
/ 29 июня 2011

И чтобы быть более полным, вы можете сделать это и с картой:

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