私はRacketマクロに飛び込み始めたばかりで、簡潔な単純なマクロ定義マクロを作成しようとしています。次のような式を拡張したいと思います。
(macro id
(param) replacement1
(params ...) replacement2)
このようなものに:
(define-syntax id
(syntax-rules ()
((id param) replacement1)
((id params ...) replacement2)))
したがって、元の式のcddrは式のペアに変換され(構文ルールの本文で使用するため)、idはこれらの各ペアの車に挿入されます。
構文規則によって提供されるパターンマッチングのみを使用すると、再帰的に考えるのに問題があります(式を通常のリストであるかのように操作したいと思っています)。どんなパターンを使うべきですか?または、どういうわけかそれを通常のリストとして操作し、展開で使用するために結果の引用を解除することはできますか?
どうもありがとう
編集-Taymonの回答によって通知された暫定的な解決策
ここでの私の好奇心の一部は、それらのペアの括弧を取り除くことでした。構文の場合を調べましたが、少し混乱したので、純粋にパターンマッチングサブ言語でそれを実行しようとしました。最終的に、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 ...))))