簡単なリスト用のループマクロの例


Tags: R6RS, マクロ

リストの要素ごとに繰り返す Common Lisp の dolist のようなものについて考える。文法は

(dolist (var list-form [result-form])
  body ...)

とする。これと同じ動作をするものを Scheme の標準の構文で書き下すと

(do ((var list-form (cdr var)))
    ((null? var) result-form)
  body ...)

となる。 syntax-rules ではこれをそのままパターン言語で記述すればよい。

(import (rnrs))

(define-syntax dolist
  (syntax-rules ()
    ((_ (var list-form) body ...)
     (dolist (var list-form (if #f #f)) body ...))
    ((_ (var list-form result-form) body ...)
     (do ((var list-form (cdr var)))
         ((null? var) result-form)
       body ...))))

ここでは result の省略された場合に未規定値を返すために (if #f #f) という式を用いている。