わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

CygwinでCoffeeScript

WEB+DB PRESS Vol.70CoffeeScriptの特集がありました.Cygwinでも使えるようにしようと,思い立ちました.
王道は,ソースから…なのですが,node.jsのビルドは,tarballから(node-v0.8.8.tar.gz)でもGitHubのから*1でも,うまくいきません.
バイナリを頼ることにしました.手順は次のとおりです.

  • Node.jsでINSTALLのボタンを押し,node-v0.8.8-x64.msiをダウンロードしました.
  • msiファイルをダブルクリックでインストール.C:\Program Files\nodejsにインストールされました.
  • Cygwinのシェルで,「/cygdrive/c/Program\ Files/nodejs/npm install coffee-script --global」を実行しました.coffeeの実行プログラムは,C\:\Users\<ユーザ名>\AppData\Roaming\npm\node_modules\coffee-script\bin\coffeeに配置されました.198バイトなので中を見たところ,nodeのスクリプトファイルになっています.
  • Windows環境変数を確認*2すると,システム環境変数Pathの末尾に「;C:\Program Files\nodejs\」が追加され,ユーザー環境変数PATHが「<Cygwinのパス>;%Path%;C:\Users\<ユーザ名>\AppData\Roaming\npm\」となっていました.ログインし直して,Cygwinのシェルを開き,「which node coffee」を実行すると,それぞれのパスが表示され,使用可能となりました.

CoffeeScriptにある例で,動作確認をしてみますか.

$ coffee -bpe "alert i for i in [0..10]"
var i, _i;

for (i = _i = 0; _i <= 10; i = ++_i) {
  alert(i);
}
$ cat > sample.coffee
# Assignment:
number   = 42
opposite = true

# Conditions:
number = -42 if opposite

# Functions:
square = (x) -> x * x

# Arrays:
list = [1, 2, 3, 4, 5]

# Objects:
math =
  root:   Math.sqrt
  square: square
  cube:   (x) -> x * square x

# Splats:
race = (winner, runners...) ->
  print winner, runners

# Existence:
alert "I knew it!" if elvis?

# Array comprehensions:
cubes = (math.cube num for num in list)
$ coffee --compile sample.coffee
$ cat sample.js
// Generated by CoffeeScript 1.3.3
(function() {
  var cubes, list, math, num, number, opposite, race, square,
    __slice = [].slice;

  number = 42;

  opposite = true;

  if (opposite) {
    number = -42;
  }

  square = function(x) {
    return x * x;
  };

  list = [1, 2, 3, 4, 5];

  math = {
    root: Math.sqrt,
    square: square,
    cube: function(x) {
      return x * square(x);
    }
  };

  race = function() {
    var runners, winner;
    winner = arguments[0], runners = 2 <= arguments.length ? __slice.call(arguments, 1) : [];
    return print(winner, runners);
  };

  if (typeof elvis !== "undefined" && elvis !== null) {
    alert("I knew it!");
  }

  cubes = (function() {
    var _i, _len, _results;
    _results = [];
    for (_i = 0, _len = list.length; _i < _len; _i++) {
      num = list[_i];
      _results.push(math.cube(num));
    }
    return _results;
  })();

}).call(this);

ところで,なぜか「コーヒー」の綴りをよく「coffie」と打ち間違えます.当初は「which node coffie」でパス確認をしていて,後者が実行できないのかと悩んだのでした.

*1:どちらも,http://nodejs.org/download/でリンクされていたものです.

*2:左下ウィンドウマーク→コントロール パネル→システム→システムの詳細設定→詳細設定→環境変数(N)...