Отображение на вектор, выполняющий побочные эффекты

Я пытаюсь перебрать вектор "строк" в Clojure. По сути, это выглядит так:

[{:start {:x 1 :y 3 :z 4}, :end {:x 3 :y 7 :z 0}}, ...]

Я хотел бы применить функцию, которая печатает каждую из этих & quot; строк & quot; на новую строку, аля:

(map #(println %) vector-of-lines)

но это, кажется, не вызывает функцию. Я не должен использовать & quot; карту & quot; функция в этом случае?

 missingfaktor02 июн. 2012 г., 19:00
Бит hashmap - красная сельдь, поэтому я удалил его из заголовка.

Ответы на вопрос(3)

Решение Вопроса
(dorun (map println vector-of-lines))

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

 sdasdadas02 июн. 2012 г., 00:24
Проблема в том, что это не печать строк. Я только включил один пример в вектор, но на самом деле он имеет размер 10. Однако использование apply все равно не приводит к вызову анонимной функции.
 Julien Chastang02 июн. 2012 г., 00:37
Вывод println должен идти на консоль, где бы она ни находилась в вашей среде.
 sdasdadas02 июн. 2012 г., 01:31
Проблема в том, что ты упомянул о Доруне. Благодарность

map ленив и не добьется результатов, если вы не попросите их. Если вы хотите выполнить побочный эффект для каждого элемента в последовательности и не заботитесь о возвращаемом значении, используйтеdoseq:

(doseq [line vector-of-lines]
  (println line))

Если вы заботитесь о возвращаемом значении, используйте(doall):

;; returns a sequence of nils, prints each line
(doall (map println vector-of-lines))
 Julien Chastang02 июн. 2012 г., 00:47
+ 1, если не заключать println в функцию, поскольку она уже является функцией.
 sdasdadas02 июн. 2012 г., 01:30
Println был просто примером. : D

doseq - это макрос, поэтому он несет в себе все ограничения макросов.

Я бы написалforeach функция, которая внутренне используетdoseq.

user=> (defn foreach [f xs] (doseq [x xs] (f x)))
#'user/foreach

user=> (foreach println [11 690 3 45])
11
690
3
45
nil

Ваш ответ на вопрос