2017-04-20 5 views
0

は、私が持っていることができcore.spec次:私が持っているしたいのですが、サブの仕様を外部化することにより、冗長性を除去するものであるシーケンススペックをネストする方法は? Clojureの持つ

(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]}] 

それでは、私が探していることは関数やマクロである(アンネスト例えば)それを動作させることになる。

(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

あなたは正規表現のop地に滞在する必要があります:あなたは非常に迅速な対応のためのアレックス・ミラー@

(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

関連する問題