Как получить ‘for’ в clojure / lisp, чтобы просто возвращать значения без создания списка?

#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))
  

Убедитесь, что вы закрыли круглые скобки для внешнего списка.