定义匹配膨胀

时间:2011-02-27 21:22:10

标签: macros scheme pattern-matching racket

关于define-match-expansion,有很少的材料和示例代码来说明这些概念。我很难“解码”文档说的内容:

(define-match-expander id proc-expr)
(define-match-expander id proc-expr proc-expr)
  

将id绑定到匹配扩展器。

     

第一个proc-expr子表达式必须   评估一个变压器   产生匹配的拍子。每当id   作为模式的开头出现,   这个变压器给出了   扩展时间,语法对象   对应于整个模式   (包括id)。模式是   取而代之的是结果   变压器。

     

由第二个产生的变压器   当使用proc-expr子表达式时   id用于表达式上下文中。   使用第二个proc-expr,id可以   内外都有意义   图案。

有人可以提供一些示例代码来说明define-match-expander的两种用法吗?

2 个答案:

答案 0 :(得分:5)

匹配扩展器背后的想法是你可以扩展'匹配'表单来处理你自己设计的新模式形式。

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

#lang racket

(define-match-expander aba
  (lambda stx
    (syntax-case stx ()
      [((_ a b)) #'(list a b a)])))

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

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

#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)
警告:在图案周围加上一对额外的parens whuffo?不确定,抱歉。

答案 1 :(得分:1)

这是一个非常古老的问题,但我想使用" syntax-rules"添加示例。对于同一个" aba"图案:

(define-match-expander aba
  (syntax-rules ()
    [(aba a b) (list a b a)]))

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

左侧(aba a b)match中的内容,右侧(list 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)])

好的部分是新的匹配器适用于所有"匹配 - 无论什么"功能,如:

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