我正在使用语法转换器在 Racket 中定义宏。我想创建一些辅助函数来帮助我操作语法。但是,我在语法转换器之外定义的函数在语法转换器内部是不可用的。例如,在下面的代码中
(define (my-function x) (+ x 1))
(define-syntax my-macro
(lambda (stx)
(datum->syntax stx (my-function (cadr (syntax->datum stx))))))
我收到错误“my-function: reference to an unbound identifier at phase: 1; the transformer environment”。
经过一番搜索,我能够编写以下代码,以便my-function
在语法转换器中可用。
(begin-for-syntax
(define (my-function x) (+ x 1)))
(provide (for-syntax my-function))
(define-syntax my-macro
(lambda (stx)
(datum->syntax stx (my-function (cadr (syntax->datum stx))))))
但问题是,my-function
这次在语法转换器之外不可用。有时我想在普通代码中检查那些辅助函数,所以我需要能够从语法转换器的内部和外部调用它,就像函数一样cadr
。我怎样才能做到这一点?
我知道我的问题与 Racket 的语法模型有关,特别是“阶段级别”的概念,但我从来没有真正理解它。如果您能提供一些易于理解的教程来解释它,我将更加感激。