次のマクロがあるとします。
(define-syntax-rule (qq x) '(1 x))
の代わりに(qq (qq 2))
展開するように見えるものを作成できますか?'(1 (1 2))
(1 (qq 2)
私が「次のように見える」と言う理由は、これまでに見つけた唯一のヒントは、インサイドアウト マクロ展開がトリッキーであることを示唆しているためです。
私の最初の動機は、Racket のパーサー ジェネレータ ライブラリと関係があります。文法を作成するために、ライブラリはparser
次のようなマクロを提供します。
(define my-parser (parser
(start start) (end EOF)
(tokens value-tokens op-tokens)
(error (lambda (a b c) (void)))
(grammar
(start [(numbers) $1])
(numbers [(numberx) (reverse $1)])
(numberx [() empty]
[(numberx NUM) (cons $2 $1)])
)
))
私の文法には、抽象化したいボイラープレートがたくさんあります。たとえば、ある種のlist-rules
抽象化を定義して、次のようなものを書けるようになりたいと思っています。
(define my-parser (parser
(start start) (end EOF)
(tokens value-tokens op-tokens)
(error (lambda (a b c) (void)))
(grammar
(start [(numbers) $1])
(list-rules NUM numbers numberx)
)
))
ただし、parser
最初に展開するlist-rules
と、実際の非端末 (numbers
およびnumberx
) に展開するのではなく、それ自体を非端末として扱います。