Macros 定义匹配扩展器

Macros 定义匹配扩展器,macros,scheme,pattern-matching,racket,Macros,Scheme,Pattern Matching,Racket,关于定义匹配扩展,有一些罕见的资料和示例代码来说明这些概念。我很难“解码”文档中的内容: (define-match-expander id proc-expr) (define-match-expander id proc-expr proc-expr) 将id绑定到匹配扩展器 第一个proc expr子表达式必须 对变压器进行评估 为比赛拍拍。无论何时 显示为模式的开始, 该变压器在以下位置给出: 扩展时间,一个语法对象 对应于整个模式 (包括身份证)。模式是 替换为 变压器 由第二个变压

关于定义匹配扩展,有一些罕见的资料和示例代码来说明这些概念。我很难“解码”文档中的内容:

(define-match-expander id proc-expr)
(define-match-expander id proc-expr proc-expr)
将id绑定到匹配扩展器

第一个proc expr子表达式必须 对变压器进行评估 为比赛拍拍。无论何时 显示为模式的开始, 该变压器在以下位置给出: 扩展时间,一个语法对象 对应于整个模式 (包括身份证)。模式是 替换为 变压器

由第二个变压器产生的变压器 在以下情况下使用proc expr子表达式: id在表达式上下文中使用。 使用第二个proc expr,可以 赋予内部和外部的含义 模式


有人能给出一些示例代码来说明定义匹配扩展器的两种用法吗?

匹配扩展器背后的思想是,您可以扩展“匹配”表单来处理自己设计的新模式表单

因此,这里有一个(有些毫无意义)的例子,它定义了一个“aba”匹配形式,它匹配一个事物的模式,然后是另一个事物,然后是第一个事物(因此称为“aba”):

第二种形式允许您添加单独的扩展以在匹配模式之外使用,如下所示:

#lang racket

(define-match-expander aba
  (lambda (stx)
    (syntax-case stx ()
      [(_ a b) #'(list a b a)]))
  (lambda (stx)
    #'(error "please don't use aba outside of patterns.")))

(match '(3 4 3)
  [(aba x y) (printf "x = ~a, y = ~a\n" x y)])

(aba x y)

注意:图案周围有什么额外的一对帕伦?不确定,抱歉。

这是一个非常老的问题,但我想为相同的“aba”模式添加一个使用“语法规则”的示例:

左侧
(aba a b)
匹配中的东西,右侧
(列表a b a)
是替换

(match '(3 4 3)
  [(aba x y) (printf "x = ~a, y = ~a" x y)])
被替换为

(match '(3 4 3)
  [(list x y x) (printf "x = ~a, y = ~a" x y)])
很好的一点是,新matcher适用于所有“匹配任何内容”函数,如:

(match-define (aba x y) (list 1 2 1))
(printf "x = ~a, y = ~a" x y

因此,您的示例显示1。(3-4-3)是否匹配aba形式,即新模式。2.你能解释一下语法case是如何工作的吗?我看不到任何地方能查到一张表格。或者说:我猜x是绑定到3,y是绑定到4,但是shows'(3 4 3)满足a b a模式?或者我的另一个理解是:define match expander,定义了一个新的模式形式以用于匹配。语法大小写#'(列表a b a)位于尾部位置,这将是返回表达式,用于匹配'(3)?如果匹配,x将绑定到3,y将绑定到4?这些是示例代码中发生的事情吗?是的,这听起来像是一个合理的总结。抱歉我使用了语法大小写而不是简单的语法规则;我只是习惯于使用syntax-case。嗯,很高兴看到是的。你的例子很有帮助!(我只是觉得我没有完全理解文档,我更喜欢示例)
(match '(3 4 3)
  [(list x y x) (printf "x = ~a, y = ~a" x y)])
(match-define (aba x y) (list 1 2 1))
(printf "x = ~a, y = ~a" x y