定义匹配膨胀

6 macros scheme pattern-matching racket

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

(define-match-expander id proc-expr)
(define-match-expander id proc-expr proc-expr)
Run Code Online (Sandbox Code Playgroud)

将id绑定到匹配扩展器.

第一个proc-expr子表达式必须求值为生成pat匹配的转换器.每当id作为模式的开头出现时,该变换器在扩展时被赋予对应于整个模式(包括id)的语法对象.该模式被变换器的结果所取代.

当在表达式上下文中使用id时,使用由第二个proc-expr子表达式生成的转换器.使用第二个proc-expr,id可以表示内部和外部模式.

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

Joh*_*nts 5

match-expander背后的想法是你可以扩展'match'表单来处理你自己设计的新模式形式.

所以,这是一个(有点无意义)的例子,它定义了一个"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)])
Run Code Online (Sandbox Code Playgroud)

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

#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)
Run Code Online (Sandbox Code Playgroud)

警告:在图案周围加上一对额外的parens?不确定,抱歉.