Спецификация Clojure — переопределить генератор проверки для предиката

Есть ли способ переопределить генератор для основной функции предиката при вызове clojure.spec.test.alpha/check?

Можно переопределить генератор предикатов по пути внутри s/gen:

(gen/generate
 (s/gen
  (s/cat :s string?)
  {[:s] #(gen/return "xyz")}))

Но такой опции не существует для test/check:

(defn xyz [s] s)

(s/fdef xyz
  :args (s/cat :s string?)
  :ret  string?)

;; throws
(test/check
 `xyz
 {:gen {[:args :s] #(gen/return "xyz")}})

Необходимо указать имя или символ, но какое имя для спецификации string?? Я пробовал использовать символы, как 'string? и `строка? но это тоже не сработало.

Переопределение генератора путем переноса string? на s/with-gen внутри s/fdef приводит к тому, что код генератора отображается внутри документов функции... что влияет на читабельность imo.

Определение новой спецификации ::string только для этой цели кажется неправильным.


person Nikola    schedule 31.03.2019    source источник


Ответы (1)


person    schedule
comment
Да, как я отметил в своем вопросе, вы также можете сделать (s/def ::string string?), а затем использовать (s/cat :s ::string) внутри s/fdef и ::string при переопределении... но я надеялся на более простое решение. - person Nikola; 31.03.2019
comment
Извините, я не прочитал последний фрагмент. Я предполагаю, что нет, если только нет какого-то хитрого способа создать спецификацию с помощью генератора аргументов. [:args :s] не сработает, потому что это должен быть символ или ключевое слово. - person akond; 01.04.2019