2011年12月12日月曜日

CoffeeScript を2日間触ってみた雑感

この週末は Node.JS, Express で書いたプログラム (JavaScript) を CoffeeScript に書き換えてみました。コード量が  1/3 になることもあるということで、当初の狙いはコードの簡略化でした。

CoffeeScript は JavaScript に素直にマッピングされるので、JavaScript を知っていれば素直に学習できます。説明ページを数時間眺めれば書けるようになります。

コード量
学習後に、JavaScript のコードを CoffeeScript に書き換えたのですが、思ったよりは短くなりません。短くなったのは主に次の2点。

  • 閉じ bracket (}) だけの行。Python と同じ indent による block なので、if, for, function などにおける閉じ bracket は省略できます。
  • 後置 if, for 。if (x) {\n y;\n } が y if x となるので(閉じ bracket 行に加えて) 1 行節約できます。ただし y 部が長い場合は x が視線の右端に寄って読みづらくなるので使わないほうが読みやすいと思います。
どちらも 1行ずつ短くなりますが、たいした量ではありません。

Loop
これまでは map(), each(), filter() などが使いたくて underscore.js を利用したり、いろんなブラウザで forEach() を使うために augment.js を利用したりしていました。
CoffeeScript の loop, comprehension の構文は強力で、なおかつ素直に for 文を使った JavaScript に変換されます。ほぼ全てのの実行環境で動作するんじゃないでしょうか。
実行環境のことを気にしなくて良いのは大きな利点です。

意外に良かった点
生成された JavaScript は (function() { コード } ).call(this); となっているため、グルーバルな名前空間を間違って汚す心配をしなくて良い。Node.JS や Titanium などの CommonJS に従う処理系では各ファイルが独自の名前空間を持つが、Browser で動作する JavaScript ではついつい global を汚してしまいがちなので、とても助かります(私が未熟なだけという話)。
global に露出したいときはこの記事にあるように root = exports ? this とすれば CommonJS と browser の両方に対応できます。(browser の場合は root が window になる)

node-dev は CoffeeScript に対応しています。コードを書き換える毎の再起動を省力化してくれます。素晴らしい。

Browser 用のコードは express-coffee で動的に CoffeeScript から JavaScript に変換できます。0.0.4 には、 Content-Type が application/octet-stream になる問題と、マルチバイト文字を CoffeeScript 内にふくむ際に Content-Length がおかしくなる問題があったので、patch を送りました。すぐに merge され 0.0.5 になりました。著者曰く"That's how open source should be. :)"だそうで。

今一歩な点
エラーが起きた際や nlogger によるソースコードの行数表示は、生成された JavaScript の行数表示になります。coffee -c で JavaScript に変換してどの行か確認する必要があります。Github の issue にて活発に議論されているので、そのうち解決されると期待するとしましょう。

その他
Coco という CoffeeScript の派生言語があります。文法を詳しく見ていませんが、コンパイル速度では Coco に分があるらしいです。
CoffeeScript と Coco が両方流行するとは思えないので、今のところメジャーな CoffeeScript に乗っても問題ないかなと思っています。

0 件のコメント:

コメントを投稿