从 Clojure 中的默认注册表将关键字解析为 Malli 模式

Resolving a keyword into a Malli schema from the default registry in Clojure

如何将关键字解析为默认 Malli 注册表中的模式?我似乎无法在注册表中查找值以遍历它。

(def registry
  (atom {}))

(defn register! [type ?schema]
  (swap! registry assoc type ?schema))

;; Combine the default registry with our own mutable registry.
(mreg/set-default-registry!
 (mreg/composite-registry
    (mreg/fast-registry (malli/default-schemas))
    (mreg/mutable-registry registry)))

(register! :db/kasse
   [:map
    [:id                            [:int {:primary-key true :db-generated true}]]
    [:odlingsplats                  [:string {:foreign-key "odlingsplatser"}]]
    [:diameter_m                    :int]
    [:djup_m                        :int]
    [:volym_m2                      [:int {:db-generated true}]]])

(malli/walk
 :db/kasse
 (malli/schema-walker identity))
;; => :db/kasse

我尝试将 :db/kasse 包装在与 malli 不同的函数中,但 none 似乎进行了查找,而 malli/-lookup 是私有的。只是 运行 (:db/kasse malli/default-registry) 也不起作用。使用 malli/schema 似乎是显而易见的选择,但似乎没有效果。

(malli/walk
 (malli/schema :db/kasse)
 (malli/schema-walker identity))
;; => :db/kasse

致电malli/deref得到答案:

(malli/walk
 (malli/deref :db/kasse)
 (malli/schema-walker identity))
;; => [:map [:id [:int {:primary-key true, :db-generated true}]] [:odlingsplats [:postgres/string {:foreign-key "odli\
ngsplatser"}]] [:diameter_m :int] [:djup_m :int] [:volym_m2 [:int {:db-generated true}]] [:namn {:optional true} [:po\
stgres/string {:db-generated true}]]] 

感谢 Clojurians slack 的 ikitommi 提供答案。他还解释了图书馆为何以这种方式工作:

The :db/kasse returned is a Malli Schema instance, it’s print output is just the form, so looks like keyword. It’s type is :malli.core/schema, which is the internal eager reference, like a Var in Clojure. If you want to get the schema behind it, you can m/deref it. But, calling m/validate on :db/kasse works too. the :malli.core/schema forwards the calls to the actual instance, like Var.