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 位置的必须是字面量关键字;关键字用于 dispatch 多态 emit-pattern-for-syntax 方法。在您的第一个示例中,两个位置均有字面量关键字;如果您查看 emit-pattern-for-syntax 的 dispatch 函数,您会看到在这种情况下,第一个关键字获胜。由于未为 :k1 定定义模式语法,因此出现错误。我相信在此情况下引用 :k1 字面量应该可以工作

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

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