anaphoric if


Tags: R6RS, マクロ

条件部の評価結果を暗黙の変数 it で参照できる制御構造 aif (anaphoric if、前方照応 if)を考える。暗黙の束縛を導入するようなマクロは syntax-casedatum->syntax で記述する。

(import (rnrs))

(define-syntax aif
  (lambda (x)
    (syntax-case x ()
      ((ctx expr then else ...)
       (with-syntax ((it (datum->syntax #'ctx 'it)))
         #'(let ((it expr))
             (if it then else ...)))))))

datum->syntax は、第二引数のオブジェクトを構文オブジェクトに変換するとき、変換結果の構文オブジェクトが第一引数の構文オブジェクトと同時にプログラム内に現れたかのように変換する。例えば上の例で、 it は通常の syntax-rules で記述したマクロのように自動的に、他の変数名と衝突しない一意な変数名に変換されるのではなく、 (aif (string->number s) it 0) と書いたときの `it' は ctx にマッチした `aif' と同一の文脈情報を持つ識別子として変換結果に挿入されるため、変換結果の then 部や else 部で通常の束縛と同じように参照することができる。