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

Metaprogramming with clojure.spec values?

我一直在尝试 clojure.spec,关于如何使用它的一个想法是生成 UI 以编辑我正在指定的地图实例。例如,它可能会生成一个带有日期选择器字段的 Web 表单,该字段用于指定为日期的键,诸如此类。

库中有一个 get-spec 方法,但似乎没有以我需要的方式对规范作为值进行操作的函数。有没有办法做一些事情,比如获取地图规范并将该地图所需的键作为向量取回?这种具有规范的元编程是否超出了 clojure.spec 的预期用例?

具有规范的元编程绝对在 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]]}}]

然后您可以从该结构中提取键集。