簡體   English   中英

Clojure 解析 Reducible 的規范

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM