scope - Racket 中的 `match` 可以具有来自外部范围的变量的模式吗?

标签 scope scheme pattern-matching racket

考虑以下示例:

#lang racket

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

如果我想匹配头部和尾部相同的对,这就是我可能写的。这不起作用,因为第二个 a被绑定(bind)为一个新变量(并且匹配任何东西)。是否有任何模式形式允许我使用以前绑定(bind)的 a从外部范围?

我知道这可以通过以下方式实现
(match* ('cat 'doge)
  [(a a) #t]
  [(_ _) #f])

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

最佳答案

使用 == :

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

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

关于scope - Racket 中的 `match` 可以具有来自外部范围的变量的模式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29978583/

相关文章:

c++ - 在 C++ 范围外调用对象

lisp - 如何将相似的显示(printf)写入方案中的文件?

lisp - 让 CL 和 Scheme 牢记在心

Lua:如何在一个角色之后开始比赛

Scala,对通用特征元组进行模式匹配,检查类型是否相等

java - MD5 Java模式

C# 创建函数作用域

javascript - 即使使用箭头函数,React 也无法读取 .then() 中未定义的属性 setState

python - 不理解 undefined reference

syntax - 不了解 SICP 中的方案程序