如何在Racket中递归展开宏且不触发未绑定标识符错误?
在Racket中自定义语言的宏全展开问题
我正在使用Racket构建一门自定义语言,希望展开给定语法中的所有宏,同时保留其他形式不变。
示例代码
#lang racket (define-syntax-rule (identity x) x) (define-syntax-rule (make-pair x y) (pair x y)) (define-syntax my-expand (lambda (stx) (define expr-stx (cadr (syntax-e stx))) (printf "expanded1: ~a\n" (local-expand expr-stx 'expression #f)) (printf "expanded2: ~a\n" (local-expand expr-stx 'expression '())) #'(void) )) (my-expand (make-pair (identity foo) (identity bar)))
期望输出
expanded1: #<syntax:expand.rkt:34:11 (pair (identity foo) (identity bar))> expanded2: #<syntax:expand.rkt:34:11 (pair foo bar)>
实际输出
expanded1: #<syntax:expand.rkt:34:11 (pair (identity foo) (identity bar))> expand.rkt:6:37: pair: unbound identifier in: pair location...: expand.rkt:6:37 context...: /usr/share/racket/collects/syntax/wrap-modbeg.rkt:46:4
我已阅读《Macros for Domain-Specific Languages》论文,了解过ee-lib包,也参考了其他基于Racket实现的语言,但仍未解决问题。
我猜测Racket展开器需要了解所有标识符的作用域(例如为了实现宏卫生性),但我的自定义语言作用域规则与Racket并不匹配,是否有简便的解决方法?
内容的提问来源于stack exchange,提问作者Martin Cejp
相关产品推荐
相关产品推荐

