4

与えられた:

(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"))

λ: 構文が悪い

4

1 に答える 1

4

パターンの左側にwith-syntaxも楕円を含めることができるため、次のことが可能になります。

(define-syntax (test stx)
  (syntax-case stx ()
    [(_ body ...)
     (with-syntax ([(body0 ...) (process-body #'(body ...))])
       #'(begin body0 ...))]))

基本的な考え方は、 ifprocess-bodyが変換された body 要素を返す場合、それらをすべて一緒に導入できるということbeginです。


あなたのprocess-body定義はwith-syntax、楕円でも使用できます。したがって、次のようなことができます。

(define-for-syntax (process-body bodies)
  (with-syntax ([(body ...) bodies])
    (syntax/loc bodies
      (λ (request)
         body ...))))

それが の定義である場合、からの結果の形状が完全なラムダ式になり、その結果を直接返すことができるため、process-body修正する必要があります。testprocess-body

(define-syntax (test stx)
  (syntax-case stx ()
    [(_ body ...)
     (process-body (syntax/loc stx (body ...)))]))

自己完結型の例として:

#lang racket

(define-syntax (test stx)
  (syntax-case stx ()
    [(_ body ...)
     (process-body 
      (syntax/loc stx (body ...)))]))

(define-for-syntax (process-body bodies)
  (with-syntax ([(body ...) bodies])
    (syntax/loc bodies
      (λ (request)
        (printf "before the body\n")
        body ...
        (printf "after the body\n")))))


;; Let's try it:    
(define p 
  (test (displayln "hello") (displayln "world")))

(p 'should-be-a-request)
于 2013-01-15T02:13:16.187 に答える