Clojure 2024现状调查中分享你的看法!

欢迎!请参阅关于页面,了解有关此工作方式的更多信息。

0
core.match

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

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

   ['(a b c)] a)

`

会导致失败的断言。

AssertionError 无效列表语法 (a b c) in (quote (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 多方法来添加 match 语法糖

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