#clojure #lisp
#clojure #lisp
Вопрос:
В Clojure, запустив этот код:
(for [i (range 5)] i)
создает список:
(0 1 2 3 4)
Но я бы хотел, чтобы предложение for выполняло только вывод каждого из чисел без создания списка. Что мне нужно изменить, чтобы достичь этого?
Комментарии:
1. Куда вы хотите вывести число? Функция в Clojure может возвращать только одно значение, поэтому, если вы хотите вернуть 5 значений, вам нужно поместить их в контейнер определенного типа — в данном случае это (ленивый) seq.
2. Я понял это. Причина, по которой я хотел извлечь значения из инструкции for, заключалась в том, что у меня уже был внешний список, объявленный вокруг инструкции for. Чтобы выполнить то, что я намеревался сделать, все, что мне нужно было сделать, это поместить (в … ) оболочку вокруг закрытой версии внешнего списка.
3. Можете ли вы опубликовать ответ на свой собственный вопрос? Это поможет людям, у которых в будущем может возникнуть тот же вопрос, что и у вас.
4. Хорошая идея. Я сделаю именно это.
5. Вы также можете отредактировать вопрос, чтобы было более ясно, куда должен идти «вывод». Я вижу другой с
println
вызовом, и он выглядит как правильный ответ, учитывая, как сформулирован ваш вопрос.
Ответ №1:
clojure.core имеет doseq
именно для этой цели:
user=> (doseq [i (range 5)] (println i))
0
1
2
3
4
nil
ноль в конце — это repl, печатающий возвращаемое значение вызова doseq после завершения обработки всех значений
Ответ №2:
Поскольку я пытался получить содержимое списка внутри отдельного списка, то, что я сделал для достижения этой цели, заключалось в том, чтобы обернуть внешний список предложением into следующим образом:
(into
'("original" "list" "contents" ...)
(for [i (range 5)] i))
Убедитесь, что вы закрыли круглые скобки для внешнего списка.