请在 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 报告)
...