2

次のマクロがあるとします。

(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) に展開するのではなく、それ自体を非端末として扱います。

4

3 に答える 3