使用clojure.spec值进行元编程?

Der*_*urn 7 clojure clojure.spec

我一直在尝试使用clojure.spec,我对如何使用它的想法是生成用于编辑我指定的地图实例的UI.例如,它可能会生成一个带有datepicker字段的Web表单,该字段用于指定为日期的键,即此类事物.

get-spec库中有一个方法,但似乎没有任何函数按照我需要的方式操作规范值.有没有办法做一些事情,比如采取地图规范并将该地图所需的键作为向量返回?这种元编程是否符合clojure.spec的预期用例之外的规范?

Ale*_*ler 7

使用规范进行元编程肯定属于clojure.spec的预期用例.

我们尚未发布(但已编写并打算)规范表格规格.通过这些,可以使规范形式本身符合并返回表示规范的数据结构,该规范可用于(例如)从地图规范中获取所需的密钥.

符合:: spec规范可能如下所示:

user=> (s/def ::name string?)
:user/name
user=> (s/def ::m (s/keys :req [::name]))
:user/m
user=> (s/conform ::spec (s/form ::m))
[:form {:s clojure.spec/keys, :args {:req [[:key :user/name]]}}]
Run Code Online (Sandbox Code Playgroud)

然后你可以从那个结构中拔出一组键.