我尝试匹配列表中的元素,在我不知道确切顺序的情况下。
此代码可以正常工作:
(match '((0 1 2) (3) (0 4) (5 6 7 8))
((list `(,a ,b ,_) _ ... `(,a ,_) _ ...)
b)
(else #f))
; result: 1
但是当我在模式中应用list-no-order
表单时,我收到错误:
(match '((0 1 2) (3) (0 4) (5 6 7 8))
((list-no-order `(,a ,_) `(,a ,b ,_) _ ...)
b)
(else #f))
; error:
; a10: unbound identifier;
; also, no #%top syntax transformer is bound
; in: a10
; expected: 1
不幸的是,在Racket reference我没有看到其他选项来实现这种匹配。
有什么解决方案吗?我不希望使用几个匹配来打破阶段中的匹配,我希望将模式保持在一个很好的单一形式。
答案 0 :(得分:1)
简短回答:匹配目前不支持此功能。但是,Alex Knauth的pull请求现在应该提供更好的错误消息。这是其中的一部分 拉请求#2000,
https://github.com/racket/racket/pull/2000
...我预计会在不到一周的时间里出现在snapshot build,也会在下一个主要版本中出现(剧透警报!)我希望是Racket v7。
嗯...同样,@ asfamaru实际上可能因提供最佳解决方案而获得赞誉;也就是说,在上面的评论中提到一个后卫。