マクロの引数の検査


Tags: R6RS, マクロ

例えば、一時識別子の生成で扱った set!-values の変数名の部分は識別子の列でならなければならない。これを検査するためには syntax-case の fender を使う。

(import (rnrs))

(define-syntax set!-values
  (lambda (x)
    (syntax-case x ()
      ((_ (var vars ...) expr)
       (for-all identifier? #'(var vars ...))
       (with-syntax (((t ts ...) (generate-temporaries #'(var vars ...))))
         #'(let-values (([t ts ...] expr))
             (set! var t)
             (set! vars ts) ...))))))

複数の条件を検査したい場合には、それらを and でつなぐ。