Я недавно пробовал Clojure Spec и столкнулся с неожиданным сообщением об ошибке.Я выяснил, что если у вас есть спецификация / или вложенная в спецификацию /, а затем функции спецификаций после спецификации / или ветви получают соответствующее значение, а не значение верхнего уровня.
Выэто можно увидеть в напечатанном значении «v» здесь (надуманный пример):
(spec/valid? (spec/and (spec/or :always-true (constantly true))
(fn [v]
(println "v:" v)
(constantly true)))
nil)
v: [:always-true nil]
=> true
Я думаю, что это может быть преднамеренно из строки документации spec / и:
Принимает предикаты / спецификации, например,
(с / и даже? # (<% 42)) </p>
Возвращает спецификацию, которая возвращает согласованное значение. Последовательные согласованные значения распространяются через остальную часть предикатов.
Но мне это кажется нелогичным, так как это затруднит повторное использование предикатов спецификации, потому что их нужно будет написать для принятия "[] ".
Ситуация становится еще хуже, если у вас есть несколько спецификаций или веток:
(spec/valid? (spec/and (spec/or :always-true (constantly true))
(spec/or :also-always-true (constantly true))
(fn [v]
(println "v:" v)
(constantly true)))
nil)
v: [:also-always-true [:always-true nil]]
=> true
Я что-то упустил здесь?