Возможно, проблема связана с недокументированным defonce
-подобным поведением defmulti
.
Если вы перезагрузите пространство имен, содержащее форму (defmulti foo ...)
, тогда defmulti
не будетобновлено.Это часто означает, что функция диспетчеризации не будет обновлена, но будут реализованы все реализации метода (в одном и том же пространстве имен).(defmulti foo ...)
ничего не делает, если переменная foo
уже связана со значением.
Чтобы исправить это в REPL, удалите мультиметод var (ns-unmap 'the.ns 'the-multimethod)
, а затем перезагрузите пространство имен (require 'the.ns :reload)
.
Чтобы предотвратить эту проблему, вы можете определить функцию отправки отдельно и передать ее переменную в defmulti
следующим образом:
(defn foo-dispatch [...]
...)
(defmulti foo #'foo-dispatch)
Когда код выглядит так, достаточно перезагрузить пространство имен, если вы сделаетеизменение на foo-dispatch
.