如何在匹配子句中重复使用匹配模式?

问题描述 投票:0回答:2

我需要匹配两种元组并从中生成地图。

两者都有一个关键字和一个字符串。一个人可以拥有第三项(语言代码)。

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

我在做什么错?

clojure clojure-core.match
2个回答
0
投票

无法解决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

0
投票

这不是Clojure附带的tupelo.core/wild-submatch?吗?您可以定义模式,例如

spec
© www.soinside.com 2019 - 2024. All rights reserved.