ナベアツを作ってみた

(define (nabeatsu)
  (let ((continue 1) (return #f))
    (letrec ((fb
	      (lambda (n)
		(let ((divisible-by-3?
		       (lambda () (zero? (modulo n 3))))
		      (has-3?
		       (lambda ()
			 (let loop ((init n) (flag #f))
			   (let ((q (quotient init 10)) (r (modulo init 10)))
			     (if (zero? q)
				 (or flag (= r 3))
				 (loop q (or flag (= r 3)))))))))
		  (set! continue (+ n 1))
		  (return
		   (string-append
		    (number->string n)
		    (if (or (divisible-by-3?) (has-3?)) "ぅぅういえぇえあ!" "!")))))))
      (lambda ()
	(let/cc kont
		(set! return kont)
		(fb continue))))))

とくちょう

  • ネタをやってくれるようにお願いすると呼び出すたびに数字を数える関数を返します。
  • 3の倍数と3がつく数字のときだけアホになります。
  • あなたが望む限りいくらでもネタを続けてくれます。

使用例

gosh> (define neta (nabeatsu))
neta
gosh> (neta)
"1!"
gosh> (neta)
"2!"
gosh> (neta)
"3ぅぅういえぇえあ!"
(中略)
gosh> (neta)
"11!"
gosh> (neta)
"12ぅぅういえぇえあ!"
gosh> (neta)
"13ぅぅういえぇえあ!"
gosh> (neta)
"14!"
(中略)
gosh> (neta)
"30ぅぅういえぇえあ!"
gosh> (neta)
"31ぅぅういえぇえあ!"
(中略)
gosh> (neta)
"2999!"
gosh> (neta)
"3000ぅぅういえぇえあ!"
gosh> (neta)
"3001ぅぅういえぇえあ!"
gosh> (neta)
"3002ぅぅういえぇえあ!"
gosh> (neta)
"3003ぅぅういえぇえあ!"
(以下略)

ちなみに、元ネタ→http://www.yabooo.org/archives/60