Почему ... s/*
выравнивается s/cat
?
... потому что регулярное выражение - это структурированная спецификация последовательности flat . Перефразируя Спец-руководство по последовательностям ...
- Когда операции регулярного выражения объединяются, они описывают одну последовательность.
- Чтобы указать вложенную последовательность, заключите ее в явный вызов
s/spec
.
Как мне указать что-то вроде [[:silent? false] [:verbose true]]
?
Чтобы указать последовательность пар, каждая из которых является ключевым словом, за которым следует логическое значение:
(s/def ::opts (s/* (s/spec (s/cat :opt keyword? :val boolean?))))
Обратите внимание на s/spec
, обертывающий s/cat
. Теперь, например, ...
=> (s/conform ::opts [[:silent? false] [:verbose true]])
[{:opt :silent?, :val false} {:opt :verbose, :val true}]
Можно, конечно, как akond , использовать
s/tuple
вместо s/cat
и
s/coll-of
вместо s/*
без необходимости вставлять s/spec
.