关于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的两种用法吗?
答案 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