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だった。うーん。概念自体は変わってないからいいんだろうけど。

RubyJavaScriptは似てると思ったけど、まあ全然違う。結構Rubyを勉強したので、違いも良く分かるし、いろいろ新鮮で面白い。