Функция Clojure для реализации последовательности - PullRequest
0 голосов
/ 07 мая 2020

У меня есть следующая функция для сбора данных c отчетов о транзакциях, вывод этого предыдущего вопроса .

(def recreate-database
  "Defines a function which when called will call each of the four given
   functions and return a collection containing the output of each."
  (juxt pt1-transact-schema
        pt1-transact-data
        pt2-transact-schema
        pt2-transact-data))

Следующим шагом является то, что каждая из этих функций может сама вызывать не одну, а серию транзакций, поэтому желаемый полный результат будет представлять собой вложенную коллекцию отчетов о транзакциях для начальной сборки базы данных.

У меня было следующее, что было неподходящим, потому что при вызове из recreate-database выше , приходит только отчет о последней транзакции, функция, конечно, возвращает только его окончательную форму.

(defn pt1-transact-data []
  (d/transact conn {:tx-data pt1-user-data})
  (d/transact conn {:tx-data pt1-path-data})
  (d/transact conn {:tx-data pt1-series-data}))

Итак, я пришел к следующему

(defn pt1-transact-data []
  (map identity
    [(d/transact conn {:tx-data pt1-user-data})
     (d/transact conn {:tx-data pt1-path-data})
     (d/transact conn {:tx-data pt1-series-data})
     (d/transact conn {:tx-data pt1-path-series-data})]))

Это работает нормально, но все еще случайная сложность. map identity является лингвистически низким уровнем по отношению к предполагаемому здесь значению.

Следовательно, мышление было, нам просто нужно « реализовать последовательность », поэтому я извлек:

(defn realize-all [coll] (map identity coll))

Потом я вспомнил doall. Просто использование этого работает и здесь.

Итак, это то же самое, что делает doall?

Я заметил из (source doall), это не похоже на то, что приводит к dorun, что приводит к ... recur.

Итак, map identity или doall или dorun, похоже, служат аналогичной цели здесь.

Эти эквиваленты? Есть еще что сказать?

1 Ответ

1 голос
/ 07 мая 2020

почему бы вам просто не обернуть его вектором? это кажется самым простым решением:

(defn pt1-transact-data []
  [(d/transact conn {:tx-data pt1-user-data})
   (d/transact conn {:tx-data pt1-path-data})
   (d/transact conn {:tx-data pt1-series-data})])

, иначе вы можете использовать mapv:

(defn pt1-transact-data []
  (mapv (partial d/transact conn)
        [{:tx-data pt1-user-data}
         {:tx-data pt1-path-data}
         {:tx-data pt1-series-data}))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...