CoffeeScriptを使ってFizzBuzz
for num in [1..100] do (num) -> console.log( switch when (num % 15 == 0) then "fizzbuzz" when (num % 3 == 0) then "fizz" when (num % 5 == 0) then "buzz" else num )
これは、以下のJavaScriptにコンパイルされる。
(function() { var num, _fn; _fn = function(num) { return console.log((function() { switch (false) { case !(num % 15 === 0): return "fizzbuzz"; case !(num % 3 === 0): return "fizz"; case !(num % 5 === 0): return "buzz"; default: return num; } })()); }; for (num = 1; num <= 100; num++) { _fn(num); } }).call(this);
ブロックスコープのないJavaScriptで大域スコープの汚染を避けるために、 (function(){})()で囲んでくれたりする。CoffeeScriptでは、ほとんどすべての部分が値を返す式として扱えるので、いちいちreturnを書かなくても大丈夫。範囲指定のリテラルも使えて、インデックスアクセスをしなくてもいい。
JavaScriptのprototypeチェーンのことを調べていて、constructorとprototypeオブジェクト、Object.__proto__あたりがスッキリと分からなかった。で、JavaScript関連のことを調べるときには「mdn」(Mozilla Developers Network)を検索語に含めろという教えに従って探してみたら、__proto__はobosleteだった。うーん。概念自体は変わってないからいいんだろうけど。
RubyとJavaScriptは似てると思ったけど、まあ全然違う。結構Rubyを勉強したので、違いも良く分かるし、いろいろ新鮮で面白い。