[英]Clojure Spec to parse Reducible
clojure.spec.alpha/+
的文檔說:
返回匹配 pred 的一個或多個值的正則表達式操作。 產生一個匹配向量
我可以這樣使用它:
erdos=> (s/conform (s/+ (s/cat :e #{\a \b \c})) (seq "abc"))
[{:e \a} {:e \b} {:e \c}]
在下一步中,我想將其概括為在 Reducible 值而不是序列上運行。 但它不會工作:
erdos=> (s/conform (s/+ (s/cat :e #{\a \b \c})) "abc")
:clojure.spec.alpha/invalid
我如何在 Reducibles 而不是序列上使用 clojure.spec正則表達式運算符? (但不創建臨時序列。)謝謝!
您可以定義一個將輸入(例如字符串)轉換為序列的整合器。 使用and將其與對序列進行操作的規范組合起來:
(s/def ::seq-from-string (s/conformer #(if (string? %) (seq %) ::s/invalid)
#(apply str %)))
(s/conform (s/and ::seq-from-string
(s/+ (s/cat :e #{\a \b \c})))
"abc")
;; => [{:e \a} {:e \b} {:e \c}]
(s/unform (s/and ::seq-from-string
(s/+ (s/cat :e #{\a \b \c})))
[{:e \a} {:e \b} {:e \c}])
;; => "abc"
這是一個更復雜的例子,在該規范之上有coll-of
:
(s/conform (s/coll-of (s/and ::seq-from-string
(s/+ (s/cat :e #{\a \b \c}))))
["a" "bb"])
;; => [[{:e \a}] [{:e \b} {:e \b}]]
順便說一句,我不確定您為什么要避免在字符串周圍創建臨時序列。 從字符串創建序列時,例如(seq "abc")
,會創建一個輕量級序列 object StringSeq來包裝底層字符串。 我不認為這有什么問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.