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

欢迎!请参阅关于页面,了解有关如何使用本站的一些更多信息。

0
core.match

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

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

   ['(a b c)] a)

`

会导致断言失败。

AssertionError: 在(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 多方法来添加 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
...