Я работаю с расширением макроса Racket syntax-id-rules
, что некоторые другие реализации схемы предоставляют под именем identifier-syntax
. Они позволяют указывать расширения макросов, которые произойдут, даже если определенный идентификатор не находится в позиции главы. Так, например:Как контролировать порядок расширения макросов схемы?
(define hidden #f)
(define-syntax proxy
(syntax-id-rules (set!)
[(set! proxy v) (set! hidden v)]
[proxy hidden]))
будет создан идентификатор proxy
быть прокси для hidden
. Это бесполезный пример, но он иллюстрирует использование.
Я нахожусь в ситуации, когда хочу глобальный обычный макрос, назовем его foo
, что я хочу переопределить в некоторых случаях, когда я использую макрос идентификатора, например proxy
. То есть, я хочу, чтобы иметь возможность сделать что-то вроде этого:
(define-syntax foo
(syntax-rules()
[(foo arg ...) 'default]))
(define hidden #f)
(define-syntax proxy
(syntax-id-rules (foo set!)
[(foo proxy arg ...) 'special]
[(set! proxy v) (set! hidden v)]
[proxy hidden]))
(foo proxy) ; should return 'special
Но на самом деле последняя строка возвращает 'default
, потому что foo
макрос получает расширен до proxy
один.
Любые идеи, как я мог бы достичь чего-то в этом направлении, но с макросом идентификатора proxy
, переопределяющим определение макроса по умолчанию для foo
? Я не привержен этой архитектуре.
Добавлено: Это не для использования в реальном мире, а в части демонстрации теоретической точки в формальной семантике.
Я подозревал, что мне нужно сделать два слоя макро-расширения; спасибо за отображение кода скелета, чтобы это произошло. Это может быть достаточно хорошим для моих целей, и это не похоже на то, что я добьюсь успеха. По сути, я нуждаюсь в чем-то вроде «синтаксиса-id-rules» или 'make-set! -transformer', но там, где мы можем предоставить дополнительные формы, такие как' foo', получим такое же специальное обращение, что 'set!' получает. – dubiousjim
'синтаксис-парсер', похоже, не нужен здесь; можно добиться такого же эффекта, используя необязательные защитные выражения в «синтаксисе-case» Racket: '(define-syntax (foo stx) (syntax-case stx() [(_ special-case arg ...) (особое условие ? # 'специальный случай) #' (специальный случай 'hidden-special-case-tag arg ...)] [(_ arg ...) #' 'default])) ' – dubiousjim
Да, конечно, re право. Я полагаю, что Racketeers обычно предпочитают «синтаксический анализ» для более выразительного языка шаблонов и улучшения возможностей отчетности об ошибках. – stchang