Как ограничить размер сгенерированного образца с помощью `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 целых чисел.

Другие вопросы по тегам