Clojure中记录的模式匹配

5

目前是否支持这个?我找到的唯一信息是来自维基百科的示例(https://github.com/clojure/core.match/wiki/Deftype-and-defrecord-matching) ,但会产生一个错误:

编译器异常java.lang.AssertionError:在(Black. (Red. (Red. a x b) y c) z d)中出现无效列表语法(Red. (Red. a x b) y c)。有效语法:[[:default :guard] [:or :default] [:default :only] [:default :seq] [:default :when] [:default :as] [:default :<<] [:default :clojure.core.match/vector]]

1个回答

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


1
这至少完成了一半的工作,但如果有两种记录类型具有相同的字段名称,是否有办法将 x 的类型纳入此模式中? - estolua
我已经修改了答案,展示了如何匹配记录类型,但这并不是非常优雅的。 - mac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接