map
является ленивым, поэтому, если вы вызываете его, не понимая получающуюся ленивую последовательность, это не имеет никакого эффекта.Вы делаете это в нескольких местах.Если вам нужно вызывать функцию для каждого элемента коллекции, только для побочных эффектов, рассмотрите возможность использования run!
.
В более общем случае реализация вашего алгоритма зависит от мутирования различных глобальных атомов.Это очень однотипно в укупорке, что делает его трудным для чтения и трудно рассуждать.Попробуйте перейти и вернуть ожидаемое состояние.Таким образом, у вас не возникнет проблема map
.
В вашем коде также есть куча условий гонки, связанных с формами вроде
(defn incc
[cat]
(if (not (contains? @cc cat))
(swap! cc #(assoc % cat 0))) ; no guarantee that @cc wasn't updated
; between here and the contains? line above
(swap! cc #(update % cat inc)))
Этот код может бытьупрощенный и безошибочный, используя fnil
(defn incc
[cat]
(swap! cc update cat (fnil inc 0)))