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

欢迎!请查看关于页面了解更多关于如何使用此信息。

0
core.match

目前无法在模式中使用带有或没有变量的列表字面量。
因此,像这样

`
(match ['(1 2 3)])

   ['(a b c)] a)

`

将会导致失败的断言。

断言错误:在(quote (a b c))中无效的列表语法(a b c)。

可以通过使用`:seq`和`:guard`作为解决方案,例如

`
(match ['(1 2 3)])

   [(([a b c] :seq) :guard list?)] a)

`

但这非常繁琐。

列表匹配在编写宏和编译器时非常有用。

2 答案

0

评论由:glchapman

注意,您可以使用`core.match`的`emit-pattern-for-syntax`多重方法添加匹配语法糖

(defmethod m/emit-pattern-for-syntax [:list :default] [[_ & pats]] (m/emit-pattern `(([~@pats] :seq) :guard list?)))

上述示例

user=> (m/match ['(1 2 3)] [(:list a b c)] a) 1

0
参考:https://clojure.atlassian.net/browse/MATCH-103(由 alex+import 报告)
...