我有一个字符序列,并尝试使用(s/cat ...)与(s/or)来使序列符合规范。
输入可能看起来像[0 1 2 3]
或[\a \b \c \d]
,并尝试使用此规范。
(s/conform (s/cat :top (s/or :nums (s/+ #{0 1 2 3 4})
:letters (s/+ #{\a \b \c \d})
... more stuff))
[0 1 2 3])
=> :clojure.spec.alpha/invalid
如果不使用(s/or)
,如果选择:nums
或:letters
中的一种,则可以工作。
(s/conform (s/cat :first-set (s/+ #{0 1 2 3 4}))
[0 1 2 3])
=> {:first-set [0 1 2 3]}
初始示例如果整个序列包含在其他vec中则可以工作,但这不是我想要的。
(s/conform (s/cat :first-set (s/or :nums (s/+ #{0 1 2 3 4})
:letters (s/+ #{\a \b \c \d})))
[[0 1 2 3]])
=> {:first-set [:nums [0 1 2 3]]}
使用(or ...)
似乎也只有在(s/keys)
内部才能工作。我认为这是因为(or
始终接受第一个规范,因为它不是假值。
(s/conform (s/cat :first-set (or (s/+ #{0 1 2 3 4})
(s/+ #{\a \b \c \d})))
[0 1 2 3])
=> {:first-set [0 1 2 3]}
(s/conform (s/cat :first-set (or (s/+ #{0 1 2 3 4})
(s/+ #{\a \b \c \d})))
[\a \b \c])
=> :clojure.spec.alpha/invalid
这是我想要发生的事情。
(s/conform (s/cat :first-set (s/something-here (s/+ #{0 1 2 3 4})
(s/+ #{\a \b \c \d})))
[0 1 2 3])
=> {:first-set [0 1 2 3]}
(s/conform (s/cat :first-set (s/something-here (s/+ #{0 1 2 3 4})
(s/+ #{\a \b \c \d})))
[\a \b \c])
=> {:first-set [\a \b \c]}
我在想这里该怎么做。