【问题标题】: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])

但我仍然想知道是否有办法从外部范围获取该变量(或者是否有理由不这样做,例如一些潜在的名称冲突问题或其他问题)。

【问题讨论】:

    标签: scope scheme pattern-matching racket


    【解决方案1】:

    使用==:

    (match '(cat . doge)
      [`(,a . ,b)
       (match b
         [(== a) #t]
         [_      #f])]
      [_ "Not a pair"])
    

    由于文档中的位置,== 很容易被忽略。

    【讨论】:

    • 同样容易忽略的是#:when。例如,子句可以是[(cons a b) #:when (eq? a b) #t]。当然== 在这个例子中更简单。
    猜你喜欢
    • 2015-07-28
    • 1970-01-01
    • 2020-06-19
    • 2023-03-21
    • 2022-06-12
    • 2014-07-06
    • 1970-01-01
    • 2016-07-13
    • 2011-06-19
    相关资源
    最近更新 更多