2015-03-21 12 views
5

Wird dies jetzt unterstützt? Die einzige Information, ich war das Beispiel aus dem Wiki (https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching) finden konnte, die einen Fehler erzeugt:Mustervergleich für Datensätze in Clojure

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

Antwort

2

Dies ist noch nicht implementiert worden, aber seit Beginn der Aufzeichnungen verhalten sich wie Karten können Sie tun:

(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 

Sie können auch auf den Typ des Datensatzes anpassen, aber es ist ein wenig unelegant.

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

, die mindestens die Hälfte der Arbeit tun, aber was, wenn es zwei Datensatztypen mit den gleichen Feldnamen, eine Möglichkeit, die Art von 'X' in dieses Muster zu integrieren? – estolua

+0

Ich habe die Antwort geändert, um zu zeigen, wie man auf den Typ des Datensatzes passt, aber es ist nicht sehr elegant. – mac