Как ограничить размер сгенерированного образца с помощью `clojure.spec/+`?
clojure.spec/coll-of
принимает :gen-max
возможность ограничить сгенерированный размер выборки. Есть ли аналог для clojure.spec/+
?
1 ответ
s/*
а также s/+
не выбирай вариант как :gen-max
но эти повторяющиеся спецификации регулярных выражений принимают clojure.spec.alpha/*recursion-limit*
в учет. Я думаю, что это довольно грубый контроль и не оказывает практического влияния на простые спецификации, подобные этой, которые, по-видимому, всегда генерируют самую длинную последовательность из ~200 элементов для любого положительного *recursion-limit*
:
(binding [clojure.spec.alpha/*recursion-limit* 1]
(->> (gen/sample (s/gen (s/* int?)) 200)
(map count)
(apply max)))
Одним из способов ограничения длины генерируемых последовательностей является предоставление собственного генератора:
(s/def ::ints
(s/with-gen
(s/+ int?)
#(gen/vector gen/int 1 10)))
(gen/sample (s/gen ::ints) 200)
Это всегда должно генерировать вектор из 1-10 целых чисел.