Вы можете использовать s/form
, который "возвращает [s] спецификацию как данные":
(s/form ::myspec)
=> (clojure.spec.alpha/keys :opt-un [:user/x :user/y])
или s/describe
для сокращенной версии того же самого:
(s/describe ::myspec)
=> (keys :opt-un [:user/x :user/y])
Оба они в конечном итоге зависят от метода describe*
протокола Spec
:
(defprotocol Spec
(conform* [spec x])
(unform* [spec y])
(explain* [spec path via in x])
(gen* [spec overrides path rmap])
(with-gen* [spec gfn])
(describe* [spec]))
Таким образом, каждая спецификация типа отвечает за свое описание.Например, реализация спецификации карты просто перестраивает свое буквальное определение из своих начальных входных данных, например:
(describe* [_] (cons `keys
(cond-> []
req (conj :req req)
opt (conj :opt opt)
req-un (conj :req-un req-un)
opt-un (conj :opt-un opt-un))))