【问题标题】:How can I get a Clojure Spec as an object?如何获得 Clojure Spec 作为对象?
【发布时间】:2018-09-28 21:44:28
【问题描述】:

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

我怎样才能得到并查看它?

例如。给定

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

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

【问题讨论】:

    标签: clojure clojure.spec


    【解决方案1】:

    您可以使用 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))))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2011-12-16
      • 2021-05-07
      • 2019-09-09
      相关资源
      最近更新 更多