Карты Clojure являются неизменяемыми, что означает, что они также являются поточно-ориентированными, что хорошо. Когда вы изменяете одно с помощью 'assoc' или аналогичного, вы создаете новую копию, в которой присутствуют ваши измененные значения. (Обратите внимание, что полная копия не сделана, но для ее создания используется эффективный метод.)
Я думаю, что, пожалуй, лучший способ сделать то, что вы хотите, это создать собственную структуру данных, потому что, по сути, вы запрашиваете изменяемый HashMap, как в Java, а не карту Clojure.
Вы можете создать оболочку вокруг существующего Java HashMap, которая переопределяет методы 'put' и 'putAll', чтобы вы могли обнаружить, что изменяется. Если у вас есть HashMap в HashMap, вы захотите, чтобы вспомогательная HashMap также имела новый тип, чтобы вы могли обнаруживать изменения на любом уровне.
Вы можете назвать это как «WatchfulHashMap». Затем вы захотите создать экземпляр этого нового HashMap, например:
(def m (ref (WatchfulHashMap.)))
Таким образом, делая один его экземпляр изменяемым из любой точки вашего приложения.