2015-03-21 4 views
5

में रिकॉर्ड पर पैटर्न मिलान क्या यह अभी समर्थित है? केवल जानकारी मैं मिल सकता से विकी (https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching) जो एक त्रुटि पैदा करता है उदाहरण था:क्लोजर

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

उत्तर

2

यह अभी तक लागू नहीं किया गया, लेकिन जब से रिकॉर्ड व्यवहार करते हैं नक्शे के रूप में आप कर सकते हैं:

(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 

आप रिकॉर्ड के प्रकार पर भी मिलान कर सकते हैं, लेकिन यह थोड़ा सा सुरुचिपूर्ण है।

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

है कि आधे काम कर रहा है कम से कम है, लेकिन क्या अगर वहाँ एक ही फ़ील्ड नाम के साथ दो रिकॉर्ड प्रकार, किसी भी तरह से इस पद्धति में 'x' के प्रकार को शामिल करने की कर रहे हैं? – estolua

+0

मैंने रिकॉर्ड के प्रकार पर मिलान करने का तरीका दिखाने के लिए जवाब में संशोधन किया है, लेकिन यह बहुत ही सुरुचिपूर्ण नहीं है। – mac