なぜ coffee-script が盛り上がるか


情報感度が高く体面を気にするIT企業の皆さんは、今日はさっさと帰れと言われてるので、やることなくなったエンジニア達がcho45さんの釣り針に釣られてハッスルしているのだと思われます。弊社も朝からudzuraあたりがハッスルしてるのをみてました。

暇なので大喜利に参加。というか、他の方が言及していない、なぜcoffee-scriptの良い面、について書きたいと思っています。

-> のエイリアスが、関数オブジェクトの意識を変えた

  • > の関数定義はJS本来の関数型言語への意識を呼び覚ましました。そもそも今までが関数型もどきの言語ポテンシャルだったくせに関数オブジェクトが文字数的な問題で使いにくかったのです。

テンプレートエンジンのCoffeekupでは、高階関数入れ子によってDOMを表現するなんてこともやってます。

doctype 5
html ->
  head ->
    meta charset: 'utf-8'
    title "#{@title or 'Untitled'} | My awesome website"
(略)


forEachで高階関数でfunctionで渡す、みたいなとき、(i)-> と書けないなんてとても不自然であると思います。
そもそもJSの仕様策定の時点で長ったらしいfunctionという文字列に誰も違和感を持たなかったのでしょうか?Dartなどはパラダイムこそ違いますが、関数定義の比重が大きい仕様なのでfuncになったわけですし。

「構造化されたJS」への需要

個人的には、よく見かけるクラスの独自実装がすごくださいと感じています。
prototype.jsやenchant.js、またnode界隈ではmatadorなどが独自クラスを使って、それぞれに互換性がありません。
box2d.jsのコードがprototype.jsを使ってASからポーティングされていたのをみるとげんなりしました。
シンタックスで一つの流儀を提供するCoffeeScriptはだいぶイカしてる方だと思います。実装も、変なことをしていませんし。

coffee

class Hoge
  constructor:-> 
  hoge:-> console.log "hoge"

JS

Hoge = (function() {
  function Hoge() {}
  Hoge.prototype.hoge = function() {
    return console.log("hoge");
  };
  return Hoge;
})();

HTML5でJSの可能性が大幅に拡張され、なんでもできるようになった反面、巨大なプログラムになりがちで、今までのバッドノウハウが散らばったJSのネット上のリソースをコピペしていると、結構な頻度で地雷を踏みます。

そこらへんの需要に応えるためにDartみたいなのが提案されているんでしょうが、アレはコケる気がします。書いてて全然面白くない。だるい。

インデントが制御構造である

僕はPythonから入門したので、インデントブロックが好きです。最近仕事でHaskellのコードを読む機会があるのですが、インデントが制御構造だというのはコードの可読性へ大いに貢献すると思います。
読みやすくなる反面、ワンライナーが使いにくくなるのですが、そもそもワンライナーで書けないコードはエディタで書けば良いと思ってますし、粒度の問題です。PerlみたいなワンライナーPerlだけがやればいいです。あと、個人的にRubyのださいところはendだと思ってます。

だめなところ

  • 関数型っぽくかける つまり手続き型からかけ離れた書き方ができる
  • => があっても、call apllyに無力
  • 暗黙のリターンは言語仕様としてはいいけど、出力されるコードが汚い
  • 即時関数の入れ子コンパイラには優しくない。
  • 三項演算子わかりにくくね?
  • 実際のエラー行とソースがずれる

(追記)
関数型っぽく、ってのは僕自身は好きなので構わないと思いますが、そういう書き方をする人は少ないし、バッドノウハウ避けるために使ってるのに個人に依存しがちな別のパラダイム持ち込んでメンテ不可にするってのは本末転倒かな、という趣旨の発言です。理解があれば構わないと思います。

((console.log(jQuery ".content#{i}").text()) for i in [1..5])

みたいなコードで全部書かれると困りませんか。

Coffee-Scriptは、鶏か、卵か?

流行らなければ誰も使わないなら、流行ればみんな使うわけです。
Github社の連中はだいたいcoffee-script使ってますし、node界隈のホットなプロダクトはだいたいcofee-scriptで書かれています。Expressのcoffee-scriptのDSLいくつあるだろう。


まあ将来廃れる可能性があるにしろ、現状のベストプラクティスだと思いますし、いずれ「JSとしての」、もっとまともな可読性重視コンパイラオプションがつくと思われるので、ポーティングはそこまでだるくないと思ってます。
あと、個人的にはJSが今後ドラスティックに変わるとはあんまり期待してません。nodeウォッチャーとしてはV8さえまともになればいいのですが・・・。