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 凄いな。