【发布时间】:2015-03-15 13:34:54
【问题描述】:
在racket/match 模式中,我想匹配一些值,然后创建一个包装它们的结构。例如,采用以下(人为的)代码:
(struct foo (a b c))
(define (foo-from-string str)
(match str
[(pregexp #px"^(.+)\\s(.+)\\s(.+)$" (list _ a b c))
(foo a b c)]
[_ #f]))
我经常发现自己在其他模式中匹配这个包含三个元素的列表,然后从中创建一个结构。因此,我想通过编写自定义匹配扩展器来简化这一点。理想情况下,它会像这样工作:
(struct foo (a b c))
(define (foo-from-str str)
(match str
[(foo-string value) value]
[_ #f]))
也就是说,它应该自动匹配一个满足正则表达式的字符串,然后在成功时将值存储到foo 结构中并将其绑定到value。我尝试编写类似以下内容来实现这一点:
(define-match-expander foo-string
(λ (stx)
(syntax-case stx ()
[(_ result)
#'(and (pregexp #px"^(.+)\\s(.+)\\s(.+)$" (list _ a b c))
(app (λ (v) (foo a b c)) result))])))
不幸的是,这失败了,因为当调用传递给app 模式的函数时,a、b 和 c 未绑定。有没有办法实现这样的匹配扩展器,以便它可以对匹配的值执行一些任意过程?
【问题讨论】:
标签: scheme pattern-matching racket