2024 Clojure状态调查中分享您的想法!

欢迎!请参阅关于页面获取更多关于如何使用本站的信息。

0
core.match
失败

(let [x [:k1 :k2 :k3]]
  (m/match [x]
           [(:k1 :<< first)] :first))



在(:k1 :<< first)中无效列表语法 :<<。有效语法
   [[:default :guard] [:or :default] [:default :only] [:default :seq]
   [:default :when] [:default :as] [:default :<<] [:default
   :clojure.core.match/vector]]


工作

(let [k1 :k1
      x [:k1 :k2 :k3]]
  (m/match [x]
           [(k1 :<< first)] :first))


这是错误还是特性?
如何正确匹配关键字?

2 个答案

0

由:glchapman

这是一个不幸的边缘情况。列表模式应该希望在第1或第2个位置有字面量关键字;关键字用于分发emit-pattern-for-syntax多方法。在您的情况下,两个位置都有字面量关键字;如果您查看emit-pattern-for-syntax的分发函数,您将看到在这种情况下,第一个关键字获胜。因为没有为:k1定义模式语法,所以您会得到错误。我相信在这种情况下引述:k1字面量应该可以工作

`
(let [x [:k1 :k2 :k3]]
(m/match [x]

       [(':k1 :<< first)] :first))```
0
参考: https://clojure.atlassian.net/browse/MATCH-125 (由alex+import报告)
...