球拍中的“匹配”可以有来自外部范围的变量模式吗?
Posted
技术标签:
【中文标题】球拍中的“匹配”可以有来自外部范围的变量模式吗?【英文标题】:Can `match` in Racket have patterns with variables from an outer scope? 【发布时间】:2015-07-10 19:06:21 【问题描述】:考虑以下示例:
#lang racket
(match '(cat . doge)
[`(,a . ,b)
(match b
[a #t]
[_ #f])]
[_ "Not a pair"])
如果我想匹配头部和尾部相同的对,这就是我可能写的。这不起作用,因为第二个 a
被绑定为一个新变量(并且匹配任何东西)。是否有任何模式形式允许我从外部范围使用先前绑定的a
?
我知道这可以通过以下方式实现
(match* ('cat 'doge)
[(a a) #t]
[(_ _) #f])
但我仍然想知道是否有办法从外部范围获取该变量(或者是否有理由不这样做,例如一些潜在的名称冲突问题或其他问题)。
【问题讨论】:
【参考方案1】:使用==
:
(match '(cat . doge)
[`(,a . ,b)
(match b
[(== a) #t]
[_ #f])]
[_ "Not a pair"])
由于文档中的位置,==
很容易被忽略。
【讨论】:
同样容易忽略的是#:when
。例如,子句可以是[(cons a b) #:when (eq? a b) #t]
。当然==
在这个例子中更简单。以上是关于球拍中的“匹配”可以有来自外部范围的变量模式吗?的主要内容,如果未能解决你的问题,请参考以下文章