Как я могу получить спецификацию Clojure как объект? - PullRequest
0 голосов
/ 29 сентября 2018

Я хочу посмотреть на структуру данных, которая представляет спецификацию Clojure.

Как я могу получить и посмотреть на нее?

Например.учитывая

(s/def ::myspec (s/keys :opt-un [::x ::y]))

Я хочу довольно распечатать внутреннее представление myspec.

1 Ответ

0 голосов
/ 29 сентября 2018

Вы можете использовать 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))))
...