2015-03-21 24 views
5

Bu destek şu anda destekleniyor mu? Bulabildiğim tek bilgilerde bir hata üretir wiki (https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching) örnek oldu: Bu henüz uygulanmamışClojure'daki kayıtlarla eşleşen modeller

CompilerException java.lang.AssertionError: Invalid list syntax (Red. (Red. a x b) y c) in (Black. (Red. (Red. a x b) y c) z d). Valid syntax: [[:default :guard] [:or :default] [:default :only] [:default :seq] [:default :when] [:default :as] [:default :<<] [:default :clojure.core.match/vector]]

cevap

2

ancak eşler olarak kayıtlar davranırlar beri yapabilirsiniz:

(defrecord ab [a b]) 
user.ab 
user> (let [x (->ab 1 1)] 
    (match [x] 
    [{:a _ :b 2}] :a0 
    [{:a 1 :b 1}] :a1 
    [{:c 3 :d _ :e 4}] :a2 
    :else nil)) 
:a1 

Ayrıca, kayıt türüyle de eşleşebilir, ancak bu biraz yetersiz.

yarım işini yapıyor
user> (let [x (->ab 1 1) 
      aba user.ab] 
    (match [(type x) x] 
    [aba {:a _ :b 2}] :a0 
    [aba {:a 1 :b 1}] :a1 
    [aba {:c 3 :d _ :e 4}] :a2 
    :else nil)) 
    :a1 

https://github.com/clojure/core.match/wiki/Basic-usage#map-patterns

+0

en azından ama aynı alan adları ile iki kayıt türleri, bu kalıp içine 'x' türünü dahil etmek herhangi bir yolu var ne olur? – estolua

+0

Kayıt türünde nasıl eşleşeceğini göstermek için cevabı değiştirdim, ancak çok zarif değil. – mac

İlgili konular