欢迎!请查看关于页面了解更多关于如何使用此信息。
目前无法在模式中使用带有或没有变量的列表字面量。因此,像这样
`(match ['(1 2 3)])
`
['(a b c)] a)
将会导致失败的断言。
断言错误:在(quote (a b c))中无效的列表语法(a b c)。
可以通过使用`:seq`和`:guard`作为解决方案,例如
[(([a b c] :seq) :guard list?)] a)
但这非常繁琐。
列表匹配在编写宏和编译器时非常有用。
评论由: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