Как выполнить функцию с побочными эффектами над вектором?
-
02-01-2020 - |
Вопрос
Поздороваться от первого лица работает нормально, почему бы не поздороваться со всеми?
(defpartial greeting [name] [:p.alert "Hello " name ", how are you?"]) (defn say-hello [name] (append $content (greeting name))) (defn say-hello-to-first-person [names] (say-hello (first names))) (defn say-hello-to-everyone [names] (map say-hello names)) (say-hello-to-first-person ["Chris" "Tom" "Jim" "Rocky"]) (say-hello-to-everyone ["Chris" "Tom" "Jim" "Rocky"])
Решение
Вы хотите doseq
, «foreach» Clojure:
(doseq [name names]
(say-hello name))
map
не работает, потому что создает ленивую последовательность:Пока вы фактически не получите доступ к элементам последовательности (чего здесь нет), ни один из них не будет оценен и побочные эффекты не возникнут.
Другой вариант — принудительно выполнить вычисление путем переноса dorun
вокруг map
.Размышление о том, почему это работает, может помочь вам понять (хотя doseq
здесь идиоматический подход).
Другие советы
Как @edbond говорит в своем комментарии, карта Fn не оценивает до необходимого момента, потому что MAP FN возвращает ленивый SEQ.
Это документ карта fn Возвращает ленивую последовательность, состоящую из результата применения F к Набор первых элементов каждого колла с последующим применением f к множеству второго предмета в каждом колу, пока какой-либо из колл измученный.Любые оставшиеся предметы в других коллах игнорируются.Функция F должен принять количество аргументов соловков.
Если вам нужно быть уверены, что значения оцениваются в одной конкретной части вашего кода, вы можете использовать Doaall или dorun