R6RS の syntax-rules

R5RS での syntax-rules の立場は曖昧だが、 R6RS ではハッキリとした立場が与えられているようだ。 関連定義を要約するとこういうことになる。

  • syntax-rules は transformer に評価される
  • transformer は構文オブジェクトを受取って構文オブジェクトを返す手続きである
  • define-syntax に与える2つめのフォームはマクロ展開時に transformer に評価される式でなければならない

併せて考えると以下のようなコードは規格 (R6RS) に適合しているはずだ。

#!r6rs
(library (foo)
  (export foo)
  (import (rnrs))
  
  (define foo
    (syntax-rules ()
      ((_ a)
       a)))
  )
#!r6rs
(import (for (foo) expand)
        (rnrs))

(define-syntax bar foo)
(display (bar 'baz))

しかし、手元で動く R6RS 処理系の内、 Ypsilon だけはエラーとなってしまった。 ついでに以下のようなコードを試してみたが、やはり Ypsilon だけはエラーを吐く。

(define-syntax simple-rule
  (syntax-rules ()
    ((_ form)
     (syntax-rules ()
       ((_) form)))))

(define-syntax foo
  (simple-rule 'bar))

(foo)

Ypsilon は識別子マクロに関しても若干の制限があるようなので、踏まないように気を付ける必要があるだろう。

Document ID: e9b931a894419495ac65fc7cad9c7216