OSバージョンを上げたついでに、llevalにも手を入れたので変更点など。

node.js はじめました

(Java|ECMA)Scriptの実装をSpiderMonkeyからnode.jsに変更しました。

これによって、今まで標準出力するメソッドは print() ではなく console.log() になります。

for (var i = 1; i <= 30; i++) console.log (
    i % 15 
        ? i % 5
            ? i % 3
                ? i : 'Fizz'
            : 'Buzz'
        : 'FizzBuzz'
);

es6もサポートしたかったので、node.jsのバージョンは0.11です。言語指定を js から es6 とすることにより、--harmony 付きで実行されます。

function *fizzBuzz() {
    for (var i = 1; i <= 30; i++) {
        var fz = '';
        if (i % 3 == 0) fz += 'Fizz';
        if (i % 5 == 0) fz += 'Buzz';
        yield fz || i;
    }
}
for (n of fizzBuzz()) console.log(n);

Ruby 2.1 の Refinements はもっと Refine するべきな件

で、ruby 2.1 もサポート開始しました。言語指定はrb21です。

それで気がついたのですが、Refinementsの実装…

あえて言おう、カスであると!

module FizzBuzz
  refine Fixnum do
    def fizzbuzz()
      fz = ''
      if (self % 3 == 0) then fz += 'Fizz' end
      if (self % 5 == 0) then fz += 'Buzz' end
      if (fz == '') then self.to_s else fz end
    end
  end
end

(1..30).each do |n|
  using FizzBuzz
  puts n.fizzbuzz
end

puts 42.fizzbuzz # why?

いくら refine が lexical scope でも、usingがそうでないって一体…

こういう逃げ道があることはあるけど…

module FizzBuzz
  refine Fixnum do
    def fizzbuzz()
      fz = ''
      if (self % 3 == 0) then fz += 'Fizz' end
      if (self % 5 == 0) then fz += 'Buzz' end
      if (fz == '') then self.to_s else fz end
    end
  end
end

eval <<EOB
(1..30).each do |n|
  using FizzBuzz
  puts n.fizzbuzz
end
EOB

puts 42.fizzbuzz

おわりに

あいかわらず無保証なので、それを理解した上でご利用ください。

Enjoy!

Dan the Maintainer Thereof