如何在单个Racket的匹配模式中多次使用绑定?

时间:2018-02-27 14:22:57

标签: pattern-matching racket

我尝试匹配列表中的元素,在我不知道确切顺序的情况下。

此代码可以正常工作:

(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我没有看到其他选项来实现这种匹配。

有什么解决方案吗?我不希望使用几个匹配来打破阶段中的匹配,我希望将模式保持在一个很好的单一形式。

1 个答案:

答案 0 :(得分:1)

简短回答:匹配目前不支持此功能。但是,Alex Knauth的pull请求现在应该提供更好的错误消息。这是其中的一部分 拉请求#2000,

https://github.com/racket/racket/pull/2000

...我预计会在不到一周的时间里出现在snapshot build,也会在下一个主要版本中出现(剧透警报!)我希望是Racket v7。

嗯...同样,@ asfamaru实际上可能因提供最佳解决方案而获得赞誉;也就是说,在上面的评论中提到一个后卫。