quasisyntax を使う


Tags: R6RS, マクロ

quasisyntax(#`)を使うと構文キーワードで例に挙げた case/pred を補助マクロを使わずに定義できる。 quasisyntax は quote に対する quasiquote のようなもので unsyntax (#,)、 unsyntax-splicing (#,@)を使ってテンプレート中に式を埋め込むことができる。

(define-syntax case/pred
  (lambda (x)
    (syntax-case x ()
      ((_ x c cs ...)
       #`(let ((v x))
           #,(let loop ((c #'c) (cs #'(cs ...)))
               (if (null? cs)
                   (syntax-case c (else)
                     (((p1 p2 ...) expr ...)
                      #'(if (or (p1 v) (p2 v) ...)
                            (begin #t expr ...)))
                     ((else expr ...)
                      #'(begin (if #f #f) expr ...)))
                   (syntax-case c ()
                     (((p1 p2 ...) expr ...)
                      #`(if (or (p1 v) (p2 v) ...)
                            (begin #t expr ...)
                            #,(loop (car cs) (cdr cs))))))))))))

また、この定義では else 節のない場合に余計な (if #f #f) が生成されないようになっている。

同様のことは with-syntax を使っても可能である(R6RS Standard Libraries 参照)。