2017-04-20 26 views
0

使用Clojure core.spec我可以有以下幾種:如何unnest序列規格?

(s/conform (s/cat :a even? :b (s/* odd?) :a2 even? :b2 (s/* odd?)) [2 3 5 12 13 15]) 
=> {:a 2, :b [3 5], :a2 12, :b2 [13 15]} 

什麼,我想有是外化的子規範刪除冗餘:

(s/def ::even-followed-by-odds 
    (s/cat :a even? :b (s/* odd?))) 

(s/conform (s/tuple ::even-followed-by-odds ::even-followed-by-odds) [2 3 5 12 13 15]) 
=> :clojure.spec/invalid 

這一個作品:

(s/conform (s/tuple ::even-followed-by-odds ::even-followed-by-odds) [[2 3 5] [12 13 15]]) 
=> [{:a 2, :b [3 5]} {:a 12, :b [13 15]}] 

所以,我正在尋找的是一個函數或宏(比如UNNEST),這將使它的工作:

(s/conform (s/tuple (unnest ::even-followed-by-odds) (unnest ::even-followed-by-odds)) [2 3 5 12 13 15]) 
=> [{:a 2, :b [3 5]} {:a 12, :b [13 15]}] 

如何才能得到呢?

回答

3

你需要留在正則表達式運算土地:

(s/conform (s/cat :x ::even-followed-by-odds :y ::even-followed-by-odds) [2 3 5 12 13 15]) 

{:x {:a 2, :b [3 5]}, :y {:a 12, :b [13 15]}} 
+0

非常感謝@亞歷克斯 - 米勒的非常迅速的反應。 – Lambder