地獄の FizzBuzz その 4

ステキな言語機能が無ければ作ればいいじゃない、という声が聞こえたので Scheme

(define-syntax anycond
  (syntax-rules ()
    ((_ e1 ...)
     (let ((result #f) (flag #t))
          (anycond-loop result flag e1 ...)
          result ))))

(define-syntax anycond-loop
  (syntax-rules (else)
    ((_ result flag (else e1 ...))
     (when flag (set! result (begin e1 ...))) )
    ((_ result flag (e1 e2 ...))
     (when e1 (set! result (begin e2 ...)) (set! flag #f)) )
    ((_ result flag (e1 e2 ...) c1 ...)
     (begin (when e1 (set! result (begin e2 ...)) (set! flag #f))
            (anycond-loop result flag c1 ...) ))))

(do ((i 1 (+ i 1)))
    ((> i 50))
    (anycond
      ((eqv? (modulo i 3) 0) (display "Fizz"))
      ((eqv? (modulo i 5) 0) (display "Buzz"))
      ((eqv? (modulo i 7) 0) (display "Pezz"))
      ((eqv? (modulo i 11) 0) (display "Hozz"))
      ((eqv? (modulo i 13) 0) (display "Shizu"))
      (else (display (number->string i))) )
    (newline) )

ところで

(foo)

(bar) (baz)

のように展開されるマクロって Scheme の syntax-rules でどうやったら書けるんだろ
(書き方がわかったら anycond-loop の最後を修正したい)
なお any という名前は SFL ( PARTHENON システム)の

any {
<ガード式> : <アクション>
<ガード式> : <アクション>
<ガード式> : <アクション>
...
else : <アクション>
}

という言語機能から。値が真のガード式全部に対応するアクションが同時に、真になるガードが無ければ else のアクションが実行される