2012-03-25 4 views
2

私はラケットマクロに潜入し始めました。簡潔なマクロ定義マクロを作成しようとしています。構文規則で使用するためにラケットマクロ - ペアを作成

(define-syntax id 
    (syntax-rules() 
     ((id param) replacement1) 
     ((id params ...) replacement2))) 

だから、元の式のCDDRは、表現のペアになっている(このような何かに

(macro id 
    (param) replacement1 
    (params ...) replacement2) 

:私はこのような表現を拡張したいと思いますid)は、これらのペアのそれぞれの車に挿入されます。

構文規則によって提供されるパターンマッチングのみを使用すると再帰的に考えるのが難しいです(通常のリストのように表現を操作したい)。どのようなパターンを使うべきですか?あるいは、どういうふうにそれを通常のリストとして操作して、展開で使用するために結果を引用符で囲まないのですか?

感謝

編集 - 暫定的な解決策、Taymonの答え

によって知らさここに私の好奇心の一部は、それらのペアリング括弧を取り除くことについてでした。私は構文を調べましたが、ちょっと混乱してしまったので、純粋にパターンマッチングのサブ言語でそれをやろうとしました。私は「pairize」与えられたテンプレート(それはアキュムレータ関数のように一種の働き)に別のマクロと組み合わせTaymonのマクロを使用して終了:

(define-syntax-rule (macro-aux id ((param ...) expr) ...) 
    (define-syntax id 
    (syntax-rules() 
     ((id param ...) expr) 
     ...))) 

(define-syntax pairize 
    (syntax-rules() 
    ((pairize id (pairs ...) p b) (macro-aux id pairs ... (p b))) 
    ((pairize id (pairs ...) p b rest ...) (pairize id (pairs ... (p b)) rest ...)))) 

(define-syntax macro 
    (syntax-rules() 
    ((macro id tpl-expr ...) (pairize id() tpl-expr ...)))) 

答えて

6

通常のような構文式を操作するマクロエクスパンダを構築することが可能ですラケットデータ。しかし、この場合はそれほど必要ではありません。

構文を少し変更して、パターン置換の各ペアを角カッコで囲むことをお勧めします。このように:

(macro id 
    [(param) replacement1] 
    [(params ...) replacement2]) 

これで、通常のパターンマッチングマクロを使用できます。ここではそれが私の感想です:

(define-syntax-rule (macro id [(param ...) replacement] ...) 
    (define-syntax id 
    (syntax-rules() 
     [(id param ...) replacement] ...))) 
+0

ありがとう!私はあなたの例が見えるまでパターンで働くエリプスがどのように働いていたのかを十分に認識しておらず、暫定的な解決策であなたのルールを使用しました。 – twf

1

Taymonが正しいとは、使用して、括弧内のパターン・交換のペアをラップすることなく、楕円でそれを行うことも可能である~seqsyntax/parseから:

(require syntax/parse/define) 
(define-simple-macro (macro id (~seq (param ...) replacement) ...) 
    (define-syntax id 
    (syntax-rules() 
     [(id param ...) replacement] ...))) 

元は好きなように使うことができます:

(macro id 
    (param) replacement1 
    (params ...) replacement2) 
関連する問題