fizzbuzz 現実トウヒ
末尾再起版。
#!/usr/bin/env gosh (define (fizzbuzz . args) (let-optionals* args ((limit 100) (fizz 3) (buzz 5)) (define inner-fizzbuzz (lambda (x result) (if (> x limit) result (inner-fizzbuzz (+ x 1) (cons (cond ((= (remainder x (* fizz buzz)) 0) 'fizzbuzz) ((= (remainder x fizz) 0) 'fizz) ((= (remainder x buzz) 0) 'buzz) (else x)) result))))) (reverse (inner-fizzbuzz 1 '()))))
何故か手を入れてしまいましたの巻。
(define (fizzbuzz . args) (let-optionals* args ((limit 100) (fizz 3) (buzz 5)) (let ((fizbuz (* fizz buzz))) (define (fizzorbuzz? x y) (= (remainder x y) 0)) (define (ret-val x) (cond ((fizzorbuzz? x fizbuz) 'fizzbuzz) ((fizzorbuzz? x fizz) 'fizz) ((fizzorbuzz? x buzz) 'buzz) (else x)) ) (define inner-fizzbuzz (lambda (x result) (if (> x limit) result (inner-fizzbuzz (+ x 1) (cons (ret-val x) result))))) (reverse (inner-fizzbuzz 1 '())))))
正しくは
以下らしい。
(define (fizzbuzz . args) (let-optionals* args ((limit 100) (fizz 3) (buzz 5)) (let ((fizbuz (lcm fizz buzz))) (define (fizzorbuzz? x y) (= (remainder x y) 0)) (define (ret-val x) (cond ((fizzorbuzz? x fizbuz) 'fizzbuzz) ((fizzorbuzz? x fizz) 'fizz) ((fizzorbuzz? x buzz) 'buzz) (else x)) ) (define inner-fizzbuzz (lambda (x result) (if (> x limit) result (inner-fizzbuzz (+ x 1) (cons (ret-val x) result))))) (reverse (inner-fizzbuzz 1 '())))))
例のソレみたくリストで云々、まではアレ。つうかあんなに簡単に遅延評価が使えるとか Ruby2.0 凄いな。