我需要匹配两种元组并从中生成地图。
两者都有一个关键字和一个字符串。一个人可以拥有第三项(语言代码)。
[<key> <value>] ~> {:type <key> :value <value>}
[<key> <value> <lang>] ~> {:type <key> :value <value> :lang <lang>}
我只需要匹配关键字为:foo
或:bar
的关键字,并决定使用clojure.core.match
:
clojure.core.match
可以,但是我想在不同的子句中重用匹配模式(ns so.example
(:require
[clojure.core.match :refer [match]]))
(defn example-1 [ast]
(let [l10n-key #{:foo :bar}]
(match ast
[(k :guard l10n-key) v lang] {:type k :value v :lang lang}
[(k :guard l10n-key) v] {:type k :value v})))
(example-1 [:foo 10])
;=> {:type :foo, :value 10}
(example-1 [:bar 20 "en"])
;=> {:type :bar, :value 20, :lang "en"}
。所以我想我可以使用一些语法引用和取消引用拼接:
:guard l10n-key
但是(defn example-2 [ast]
(let [l10n-key-match [:guard #{:foo :bar}]]
(match ast
[`(k ~@l10n-key-match) v lang] {:type k :value v :lang lang}
[`(k ~@l10n-key-match) v] {:type k :value v})))
表达式崩溃:
defn
我在做什么错?
无法解决Unexpected error (AssertionError) macroexpanding match at (form-init11111096422056977084.clj:3:5).
Invalid list syntax (clojure.core/concat (clojure.core/list (quote so.example/k)) l10n-key-match) in (clojure.core/seq (clojure.core/concat (clojure.core/list (quote so.example/k)) l10n-key-match)). Valid syntax: [[:default :guard] [:or :default] [:default :only] [:default :seq] [:default :when] [:default :as] [:default :<<] [:default :clojure.core.match/vector]]
的问题,但是您不需要真正的简单的东西:
clojure.core.match
这不是Clojure附带的tupelo.core/wild-submatch?吗?您可以定义模式,例如
spec