Ответ 1
Одним из способов перевода императива для цикла в Clojure является использование макроса for
.
(for [i (range 10)] (inc i))
Вышеуказанная функция вернет все числа от 0 до 9 с шагом 1. Однако, похоже, вы просто хотите перебирать последовательную коллекцию и использовать каждый элемент. Если это все, что вам нужно, то вам не нужно ссылаться на значение индекса, вместо этого вы можете напрямую ссылаться на каждый элемент.
(for [d my-vec-of-data] (my-function d))
Однако для этого простого случая функция map
, вероятно, будет лучшим выбором, потому что она предназначена для вызова функций с аргументами из коллекций. Следующий пример эквивалентен использованию for
выше.
(map my-function my-vec-of-data)
Оба map
и for
возвращают коллекцию значений, состоящую из значений, возвращаемых my-function
. Это связано с тем, что структуры данных Clojure неизменяемы, поэтому необходимо вернуть новую коллекцию. Если это не то, что вам нужно, или если ваша функция имеет побочные эффекты, вы можете использовать doseq
вместо for
, который возвращает nil
.