TL;DR
s/andは複数の述語を AND 条件で組み合わせた新しい Spec を作る。s/orを使うと、文字列かキーワードかのような OR 条件の Spec も書ける。
内容
Spec は自分で定義することもできる。たとえば次は、値が 0〜100 の間に収まっているかを確かめる Spec である。
(def valid-%? (s/and number? #(>= % 0) #(<= % 100)))s/and は、渡された複数の述語を AND 条件で組み合わせた、新しい Spec を作る関数である。ここで使っている #(…) は無名関数の糖衣構文で、% は引数を表す。
自作した Spec は valid? で次のように使える。
(s/valid? valid-%? 42) ; true
(s/valid? valid-%? 105) ; false同じように、文字列かキーワードかを確かめる Spec は次のように書ける。
(def string-or-symbol?
(s/or :string string? :keyword keyword?))