У меня есть следующий код внутри let
; clause in a let
lessons-full (into []
(map #(dissoc (merge % (first (lesson-detail %)))
:id :series_id :lesson_id :num))
lessons)
странным образом, я в итоге случайно использовал форму преобразователя в , получив парен в неправильном месте. Это версия, показанная выше. Для сравнения, версия без преобразователя:
; clause in a let
lessons-full (into []
(map #(dissoc (merge % (first (lesson-detail %)))
:id :series_id :lesson_id :num)
lessons))
, которая также работает.
У меня есть еще пара вещей, которые я хочу сделать в этом преобразовании, включая преобразование значения ключа, называемого :type
, которая в настоящее время является строкой, с keyword
. Однако это становится высокой когнитивной нагрузкой. Пока не разбираюсь в операторах потоков. Кто-нибудь может помочь с первыми шагами / процессом мышления для этого?
lessons
- это список карт из запроса jdb c.
обновление: черновой ответ - мыслительный процесс для преобразования в поток последнего оператора
Шаг 1
Подготовка к жонглированию. 1. Начните с последнего потока ->>
, 2. поместите аргумент, lessons
вперед, 3. поместите окончательное преобразование into
в конце. Эта версия работает, но мы еще не закончили:
; clause in a let
lessons-full (->> lessons
(map #(dissoc (merge % (first (lesson-detail %)))
:id :series_id :lesson_id :num) ,,,)
(into [] ,,,))
Обратите внимание, что тройные запятые ,,,
игнорируются clojure, и мы добавляем их, чтобы помочь визуализировать, где находится аргумент внедряется последним макросом ->>
.
Шаг 2
Мы вытаскиваем dissoc
, но так как мы использовали его в вызове map
когда мы вытаскиваем его, нам нужно заключить его в другой вызов map
.
; clause in a let
lessons-full (->> lessons
(map #(merge % (first (lesson-detail %))) ,,,)
(map #(dissoc % :id :series_id :lesson_id :num) ,,,)
(into [] ,,,))
Так что это тоже работает. Позвольте этому погрузиться.
обновление 2
Наконец, вот код, который достигает моей первоначальной цели:
; clause in a let
lessons-full (->> lessons
(map #(merge % (lesson-detail %)) ,,,)
(map #(dissoc % :id :series_id :lesson_id :num) ,,,)
(map #(assoc % :type (keyword (:type %))) ,,,)
(into [] ,,,))
Похоже, что список композиций не так просто использовать внутри последнего макроса потока, если я не ошибаюсь. Кроме того, я трижды картирую карту. В моем текущем случае использования это может не иметь значения, но есть ли что-то, что можно здесь сказать относительно производительности или каких-либо других возможных улучшений?