_Comment made by: alexmiller_
[原始描述来自票务:]
我创建了一个不符合规范的生成器(doh!). 生成器包含such-that谓词。当我尝试从生成器创建示例时,我得到这个错误
ExceptionInfo 在100次尝试后无法满足such-that谓词。 clojure.core/ex-info (core.clj:4725)
我假设这是指我的自定义生成器,但这是一条红鲱鱼,因为实际上规范必须使用such-that来确保生成的值符合规范,并且是这种such-that导致了失败,而不是我自定义生成器中的那个。
代码(问题已修正,但显示了生成器中的such-that
(defn mod11-checkdigit
"计算校验位,请参阅
http://freagra.com/imthealth/mitNNC.html" [n]
(let [x (->> (map #(Integer/parseInt (str %)) (take 9 n))
(map * (range 10 1 -1))
(reduce +))
y (mod x 11)
c (- 11 y)]
(cond (== 10 c) nil
(== 11 c) 0
:else c)))
(def nhs-number-gen
"生成有效的英国国民保健服务编号"
(gen/fmap #(str (+ (* 10 %) (mod11-checkdigit (str %))))
(gen/such-that #(mod11-checkdigit (str %))))
(gen/choose 100000000 999999999))))
(defn nhs-number?
"如果传入的是有效的英国国民保健服务编号则返回true,否则返回false"
[n]
(and (string? n) (= 10 (count n)) (= (str (mod11-checkdigit n)) (str (last n)))))
(s/def ::nhs-number (s/with-gen nhs-number?
(fn [] nhs-number-gen)))
如果生成的值不符合规定的错误抛出会更方便。