在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))])))
不幸的是,這種失敗,因爲a
,b
,和c
,是綁定在函數傳遞給app
模式被調用。有什麼辦法來實現這樣的匹配擴展器,以便它可以對匹配的值執行一些任意的過程?