【发布时间】:2018-09-28 21:44:28
【问题描述】:
我想看看代表 Clojure Spec 的数据结构。
我怎样才能得到并查看它?
例如。给定
(s/def ::myspec (s/keys :opt-un [::x ::y]))
我想漂亮地打印 myspec 的内部表示。
【问题讨论】:
标签: clojure clojure.spec
我想看看代表 Clojure Spec 的数据结构。
我怎样才能得到并查看它?
例如。给定
(s/def ::myspec (s/keys :opt-un [::x ::y]))
我想漂亮地打印 myspec 的内部表示。
【问题讨论】:
标签: clojure clojure.spec
您可以使用 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])
这两者最终都依赖于Spec 协议的describe* 方法:
(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))))
【讨论】: