如何获得Clojure Spec作为对象?

时间:2018-09-28 21:44:28

标签: clojure clojure.spec

我想看看代表Clojure Spec的数据结构。

如何获取和查看?

例如。给

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

我想漂亮地打印myspec的内部表示形式。

1 个答案:

答案 0 :(得分:2)

您可以使用s/form来“将规格作为数据返回”:

(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]))

因此,每个规范 type 都负责描述自己。例如,地图规范实现仅从其初始输入中重建其文字定义,如下所示:

(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))))