我一直在尝试使用Clojure spec,我经常面临需要提出一个自定义谓词函数的情况。然后有时这些谓词函数需要自定义生成器。我该如何在不同的属性之间共享这个谓词+生成器包?
(也不那么重要,但我可以把这个谓词-fn + 生成器包称作spec吗?)
示例
假设我有一个自定义谓词
(defn local-date? [x]
(instance? LocalDate x))
然后我为它定义了一个全新的生成器函数
(defn local-date-generator []
(gen/fmap #(LocalDate/ofInstant (Instant/ofEpochMilli %) (ZoneId/of "UTC"))
(gen/large-integer)))
我可以继续并定义一个属性,例如
(s/def :person/birth-date (s/with-gen local-date local-date-generator))
但每次我创建一个LocalDate属性时,我都必须定义这个s/with-gen
。
我该如何抽象化呢?
我得出的结论是,这样做的正确方法是在一个命名空间中定义属性(例如 myprojec.specs
),在那里我创建一个有这个spec的属性
(s/def ::local-date (s/with-gen local-date local-date-generator))
然后就可以在其他地方重用它了
(s/def :person/birth-date :myproject.specs/localdate)
有哪些替代方案?