与えられた:
(define-syntax (test stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([body0 (process-body #'(body ...))])
#'body0)]))
ヘルパーでパターンと楕円を受け取るにはどうすればよいですか? body を () で囲むのが正しいかどうかさえわかりませんが、私はそれを見てきましたが、クラッシュしないのはそれだけです。
process-body プロシージャは、それをラップする余分な () を含む構文で終了します。これをバラバラにしようとすることはできますが、これを行う正しい方法は何だろうと思っています。
process-body は、ボディ パターンの前後に何らかのコードをラップします。そして、define と同様に、1 つのリスト内のすべてのフォームではなく、複数のフォームをマクロに提供できるようにしたいと考えています。したがって、(form1) (form2) が指定された場合、form2 は楕円で、プロセス本体は (do-something) (form1) (form2) (do-something-else) を実行する必要があります。
つまり、
(define-for-syntax (process-body body-syntax)
(with-syntax ([stx body-syntax])
(syntax/loc body-syntax
(λ (request)
stx))))
もちろん、テンプレートをインラインで定義すると、これが機能します。ここでそれを行うこともできると思いますが、テンプレートが扱いにくくなることもあり、ヘルパーを呼び出すと便利です。
どうもありがとう。
dyoo の最初の例を試すための編集として、以下を提供します。
#lang racket
(define-syntax (test2 stx)
(syntax-case stx ()
[(_ body ...)
(with-syntax ([(body0 ...) (process-body2 #'(body ...))])
#'(begin body0 ...))]))
(define-for-syntax (process-body2 bodies)
(with-syntax ([(body ...) bodies])
(syntax/loc bodies
(λ (request)
body ...))))
(test2 (print "hi"))
λ: 構文が悪い