1

match-extensions を記述するためのヘルパー マクロを作成したいと考えています。私はこのようなものを持っています:

(define-match-expander my-expander
  (λ (stx)
    (let* ([dat (cdr (syntax-e stx))]
           [var1 (car dat))]
           [var2 (cadr dat)])
      ;transformer goes here )))

したがって、この let バインディングを実行するマクロが必要でした。私はこのようなものから始めました:

(define-syntax-rule (define-my-expander (id vars ...) body)
  (define-match-expander id
    (λ (stx)
      (match-let ([(vars ...) (cdr (syntax-e stx))])
        body))))

ただしmatch-let、変換時間には定義されていません。

最初の質問は、これを行う他の方法はありますか (つまり、このエキスパンダーを作成する)? おそらく、私が気付いていない plt-scheme に似たようなものがすでにあるか、または何らかの方法で間違っている可能性があります。

最初の質問に対する回答に関係なく、変数のリストをマクロ内の値のリストにバインドしたい場合は、どうすればよいですか?

編集: Eli の回答マクロと組み合わせると、次のようになります。

(define-syntax-rule (define-my-expander (id vars ...) body)
  (define-match-expander id
    (λ (stx)
      (syntax-case stx ()
        [(_ vars ...)
         body]))))
4

1 に答える 1

4

あなたが達成しようとしていることはわかりませんが、これは正しい方向に進んでいると思います。

(define-match-expander my-expander
  (lambda (stx)
    (syntax-case stx ()
      [(_ (var1 var2) stuff ...)
       ;; use #'var1 #'var2 and #'(stuff ...) here
       ])))

問題はsyntax-e、構文オブジェクトを「ラップ解除」して、それが保持するものを提供するために使用されることですが、実際の内容に驚くかもしれません。たとえば、(foo . (bar))とは内容が少し異なります(foo bar)。したがって、一般的に言えば、 を使用syntax-caseしてパターン マッチングを行う方がはるかに簡単です。簡単になるだけでなく、エラーが発生したときに、コードで得られるものではなく、適切なエラー メッセージが表示されます。

于 2010-01-12T21:01:08.813 に答える