短い答え
あなたのために懸命に仕事をするためにmake-wrapping-module-begin
を使用してください。
(require syntax/wrap-modbeg)
(define-syntax module-begin (make-wrapping-module-begin #'wrap-expression))
(define-syntax (wrap-expression stx)
(syntax-case stx()
[(_ expr) #'(println expr)]))
wrap-expression
には、式で必要なものを変更します。定義、require
フォームなどには適用されません。一度に1つずつ、一度に1つずつモジュール本体式を取得することに注意してください。
長い答え
あなただけのマクロエクスパンダとプリミティブ#%plain-module-begin
フォームはそれを行うことができますなど、モジュールレベルの定義を登録する力を持っているrequire
フォームを解釈しません。したがって、module-begin
マクロはに協力してと一致させる必要があります。
あなたのマクロを使用すると、次の区別できるように、部分的に各モジュールレベルのフォームを展開するlocal-expand
を使用する必要があります。
- モジュールレベルの定義
require
とprovide
フォーム
begin
シーケンス、どのモジュール本体に接続する必要があります。
require
またはprovide
という形式を取得した場合は、#%plain-module-begin
プリミティブに投げてください。あなたが扱う表現。もう一度、あなたは好きです。 begin
フォームの場合は、サブフォームにあなたの再発があります。コードは次のようになります。
(define-syntax (module-begin stx)
(syntax-case stx()
[(_ form ...)
#'(#%plain-module-begin (wrap-module-form form) ...)]))
(define-syntax (wrap-module-form stx)
(syntax-case stx()
[(_ form)
(let ([e-form (local-expand #'form 'module #f)])
(syntax-case e-form (begin define-syntaxes define-values #%require #%provide)
[(define-syntaxes . _)
e-form]
[(define-values . _)
e-form]
[(#%require . _)
e-form]
[(#%provide . _)
e-form]
[(begin inner-form ...)
#'(begin (wrap-module-form inner-form) ...)]
[expr
#'(wrap-expression expr)]))]))
(define-syntax (wrap-expression stx)
(syntax-case stx()
[(_ expr) #'(println expr)]))
すべての新しいコードはmake-wrapping-module-begin
が自動的にやっていることは基本的です。
その詳細で包括的な答えをありがとう。私にはフォローアップの質問がありますが、これは私の無知を示していますが、私は恐れています。私の質問によれば、式をリストにまとめるにはどうしたらいいですか?あなたが言うように、wrap-extensionマクロは式を一度に1つしか扱うことができません。 –