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 ...)))