2015-03-21 10 views
5

Czy to jest teraz obsługiwane? Jedyne informacje mogłyby znaleźć był przykład z wiki (https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching) które powoduje błąd:Dopasowywanie wzorców do rekordów w 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]]

Odpowiedz

2

ta nie została jeszcze wdrożona, ale ponieważ zapisy zachowywać jak mapy można zrobić:

(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 

Można również dopasować typ rekordu, ale jest nieco nieelegancki.

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

że robi połowę pracę przynajmniej, ale co, jeśli istnieją dwa typy rekordów z tymi samymi nazwami pól, jakiś sposób, aby włączyć typ 'x' do tego wzoru? – estolua

+0

Poprawiłem odpowiedź, aby pokazać, jak dopasować do typu rekordu, ale nie jest to zbyt eleganckie. – mac

Powiązane problemy