Clojure中记录的模式匹配

时间:2015-03-21 14:37:05

标签: clojure pattern-matching

现在支持吗?我能找到的唯一信息是维基的例子(https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching) 这会产生错误:

  

CompilerException java.lang.AssertionError:无效的列表语法(红色。   (红色.a x b)y c)in(黑色。(红色。(红色.a x b)y c)z d)。有效   语法:[[:default:guard] [:或:default] [:default:only] [:default   :seq] [:default:when] [:default:as] [:default:<<] [:default   :clojure.core.match /矢量]]

1 个答案:

答案 0 :(得分: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