Идея экспандера совпадений состоит в том, что вы можете расширить форму «совпадения» для обработки новых шаблонных форм вашего собственного дизайна.
Итак, вот (несколько бессмысленный) пример, который определяет форму соответствия «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)
Предостережение: что за дополнительная пара скобок вокруг шаблона?Не уверен, извините.