Создание динамического вектора/списка

Я новичок в Clojure и хочу динамически построить вектор/список.

Я создал эту функцию generate-map, которая возвращает map, например:

{:key 1, :value 1, :other [...]}

В этой другой функции get-statement у меня есть doseq, вызывающий эту функцию generate-map.

(defn get-statement
  [st] 
  (doseq [s st] (generate-map s)))

Я хотел бы построить одну карту, объединяющую все эти generate-maps возвраты по вызову doseq, например:

[{:key 1, :value 1, :other [...]}
 {:key 2, :value 2, :other [...]}
 {:key 3, :value 3, :other [...]}]

Как я могу это сделать? Спасибо!


person isamendonca    schedule 18.07.2017    source источник
comment
1. Не используйте doseq, так как вам нужен результат. Используйте for. 2. Найдите функцию into. (into {}...). Я бы отправил ответ, но я на часах :/   -  person Carcigenicate    schedule 18.07.2017
comment
3. Результат, который вы хотите создать, выглядит незаконным; карта должна быть парами ключ/значение. Вы имели в виду, что вам нужен вектор карт?   -  person Carcigenicate    schedule 18.07.2017
comment
Спасибо! Это сработало :)   -  person isamendonca    schedule 18.07.2017
comment
Нп. Проверьте ответ, который я только что опубликовал. Немного раскрывает темы.   -  person Carcigenicate    schedule 18.07.2017
comment
Обратите внимание: я обновил ответ прямо перед тем, как вы его приняли, поэтому я не уверен, видели ли вы редактирование. Существует гораздо более короткая версия, чем использование for. Видно, я устал. Не уверен, почему мой разум сразу же перескочил на (into [] (for ...)). mapv почти определенно является подходящим инструментом для этой работы, если только вам не нужна какая-то фильтрация.   -  person Carcigenicate    schedule 18.07.2017


Ответы (1)


Если вы хотите создать несколько карт и поместить их в вектор, просто используйте for в сочетании с vec или (into [] ...):

(into [] ; ... and place them in a vector
  (for [d data] ; ...for each datum in data...
    (generate-map d))) ; Generate a map...

Or mapv:

(mapv generate-map data) ; Super succinct!

Никогда не используйте doseq для чего-то подобного. doseq ничего не возвращает, поэтому вам придется использовать atom или другой беспорядок с эффектами, чтобы действительно что-то получить из цикла.

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

  • Используйте for, map, reduce (или любую другую функциональную конструкцию цикла), если вам нужен результат после цикла.

person Carcigenicate    schedule 18.07.2017