地獄の 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 のアクションが実行される