構文キーワード


Tags: R6RS, マクロ

構文キーワードを使うマクロの例として、 case の datum の代わりに述語を指定できる構文を考える。

(library (case/pred aux)
  (export %case/pred else)
  (import (rnrs))

  (define-syntax %case/pred
    (syntax-rules (else)
      ((_ x ())
       (if #f #f))
      ((_ x ((p1? p2? ...) body ...) cls ...)
       (if (or (p1? x) (p2? x) ...)
           (begin #t body ...)
           (%case/pred x cls ...)))
      ((_ x (else body ...))
       (begin (if #f #f) body ...))))
  )

(import (rnrs) (for (case/pred aux) expand))

(define-syntax case/pred
  (syntax-rules ()
    ((_ x cls ...)
     (let ((y x))
       (%case/pred y
         cls ...)))))

cond の else のような構文キーワードは、 syntax-rules の最初の括弧の中に並べ、その束縛が自由である(= let 等で束縛されていない。 define でトップレベルに定義されている場合は除く)場合、 syntax-rules のパターン部分にマッチする。

ここでは各節の式群は 0 個でもよいものとし、その場合通常の条件節では #t を返し else 節では未規定値を返すものとして、空の begin —— (begin) を避けている。各節には必ずひとつ以上の式が現れなければならないように構文を定義してもかまわない。