Карта может содержать все определенные ключи ключевых слов из определенного пространства имен или может содержать комбинацию неквалифицированных ключей или определенных ключей из нескольких пространств имен. Вот функция для получения набора всех пространств имен (в виде ключевых слов) из квалифицированных ключевых слов на карте:
(defn key-namespaces
"Returns set of all namespaces of keys in m."
[m]
(->> (keys m)
(keep (comp keyword namespace))
(set)))
Теперь вы можете использовать это как dispatch-fn
для мультиметода:
(defmulti do-thing key-namespaces)
(defmethod do-thing #{:foo} [m] (prn m))
(do-thing #:foo{:bar 1})
;; #:foo{:bar 1}
(foo {:bar/bar 1})
;; no multimethod found exception
Вы можете указать несколько префиксов пространства имен в этом наборе, или вы можете использовать другой dispatch-fn
в зависимости от вашего варианта использования.