“Buzzになる数字をn個挙げる”をSmalltalkで

ときどきの雑記帖 2012 経由

Squeak Smalltalk で書いてみる。

| fizzbuzz buzzgen |
fizzbuzz := [:n |
   | str | str := ''.
   (n isDivisibleBy: 3) ifTrue: [str := str, 'Fizz'].
   (n isDivisibleBy: 5) ifTrue: [str := str, 'Buzz'].
   str ifEmpty: [n]].

buzzgen := Generator on: [:g |
   1 to: Float infinity do: [:n | (fizzbuzz value: n) = 'Buzz' ifTrue: [g yield: n]]].

buzzgen next: 100
=> an OrderedCollection(5 10 20 25 35 40 50 55 65 70 80 85 95 100 110 
115 125 130 140 145 155 160 170 175 185 190 200 205 215 220 230 235 
245 250 260 265 275 280 290 295 305 310 320 325 335 340 350 355 365 
370 380 385 395 400 410 415 425 430 440 445 455 460 470 475 485 490 
500 505 515 520 530 535 545 550 560 565 575 580 590 595 605 610 620 
625 635 640 650 655 665 670 680 685 695 700 710 715 725 730 740 745)