Racket 如何捕获展开的表单?

Racket 如何捕获展开的表单?,racket,Racket,我试图通过定义自己的模块begin来捕获扩展的表单: (define-syntax-rule (my-module-begin e ...) (#%module-begin e ... (foo e ...))) 我说的foo这里有原始表格,对吗?如果是这样的话,foo是否有办法获得扩展表单?要获得扩展表单,您需要以某种方式使用 第1部分,不完整的解决方案 您可能会想单独调用每个表达式,如下所示: #lang racket (require syntax

我试图通过定义自己的
模块begin
来捕获扩展的表单:

(define-syntax-rule (my-module-begin e ...)
  (#%module-begin            
   e ...
  (foo e ...)))

我说的
foo
这里有原始表格,对吗?如果是这样的话,
foo
是否有办法获得扩展表单?

要获得扩展表单,您需要以某种方式使用

第1部分,不完整的解决方案 您可能会想单独调用每个表达式,如下所示:

#lang racket

(require syntax/parse/define
         (for-syntax syntax/stx))

(define-simple-macro (my-module-begin e ...)
  ; define a function that expands it
  #:do [(define (expand/mod-ctx e)
          (local-expand e 'module '()))]
  ; get the expanded versions by calling that function on the e's
  #:with (e-expanded ...) (stx-map expand/mod-ctx #'(e ...))
  ; use the expanded versions inside foo
  (#%module-begin            
   e-expanded ...
   (foo e-expanded ...)))
e
表单是
(+12)
(let([x3][y4])(makelist xy))之类的表达式时,这一点就起作用了。但是,当
e
表单可以被定义时,它就不起作用了

第2部分,从Racket的
#%模块开始获取扩展版本
支持使用这些模块级定义的一种方法是在展开之前将其包装在racket的
#%module begin
表单中。这允许它在一次调用中同时处理所有
e
s

这将使Racket的
#%模块开始处理定义,完成后,您可以使用
(u e-expanded…
)在其上进行模式匹配

(define-simple-macro (my-module-begin e ...)
  ; get the expanded versions by calling that function on a
  ; *constructed* module-begin form
  #:with (_ e-expanded ...) (local-expand #'(#%module-begin e ...) 'module-begin '())
  ; use the expanded versions inside foo
  (#%module-begin            
   e-expanded ...
   (foo e-expanded ...)))