Squeak Smalltalk で、Python と Haskell のに触発された FizzBuzz


ときどきの雑記帖 リターンズ - HaskellでFizz(ry 経由で、Python の repeat を使った odz buffer - FizzBuzzHaskell の cycle を使った版とまあ似ていなくもないかな…と思った Squeak Smalltalk の #atWrap: を使った版。

(1 to: 100) collect: [:n | 
   | fzbzStr |
   fzbzStr := (#('' '' Fizz) atWrap: n), (#('' '' '' '' Buzz) atWrap: n).
   fzbzStr ifEmpty: [n] ifNotEmpty: [fzbzStr]]


Ruby だと、#if_empty を空文字列でないときレシーバを返すように特殊化して(Ruby はブロックを二つ以上とることを捨てているので…)、おおよそこんな感じ。

class Array; def at_wrap(n); self[n % size] end end
class String; def if_empty; empty? ? yield : self end end

(1..100).collect do |n|
  fzbz_str = ['Fizz','',''].at_wrap(n) + ['Buzz','','','',''].at_wrap(n)
  fzbz_str.if_empty {n}
end