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的两种用法吗?
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?不确定,抱歉.