我已经尝试使用Clojure spec,并且经常遇到需要制定自定义谓词函数的情况。然后有时这些谓词函数需要自定义生成器。我如何在不同的属性之间共享这个谓词 + 生成器包?
(此外,这不是特别重要,但,我能否将这个谓词 - 生成器包称为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
),在那里我创建一个具有该属性的属性
(s/def ::local-date (s/with-gen local-date local-date-generator))
然后在其他地方重用它
(s/def :person/birth-date :myproject.specs/localdate)
有没有其他选择?