CoffeeScript雑感

http://coffeescript.org/
CoffeeScriptで虫餌シミュレータ(http://culage.github.io/InsectSim/InsectSim.html)というのを作ってみて、思ったこと。



基本的には素晴らしい言語。自分が擬似コードを書いていた文法に似てるというのもあるが、インデントブロック、コンストラクタでのメンバ自動代入、クラスなどの記述力は魅力的で考えるために書いたものがそのまま動きうる。
だが素晴らしいゆえに、(自分から見た)欠点が目立ってしまう。

まず、やはりどう言い繕ってもjavascrptに変換したときの見辛さはある。
特に末尾が勝手にreturnされるのは気持ちが悪い。最後がループ処理だと特に。

# シンプル
f = (items)->
	for item in items
		item.method()

 ↓

// シンプ……ル?
f=function(items) {
    var item, _i, _len, _ref, _results;
    _ref = this.items;
    _results = [];
    for (_i = 0, _len = _ref.length; _i < _len; _i++) {
      item = _ref[_i];
      _results.push(item.method());
    }
    return _results;
  };

最後に毎回returnや@を付けることで解消できるが、それでは記述量を減らしてスマートにというお題目から考えると悲しい対策だ。
ラムダ式っぽく1行で書くときはreturn要らないのは便利なのだが、インデント組む場合は不要なreturn値生成ロジックが入ってしまうデメリットが大きい。関数型言語的にすることに、こだわりすぎてる気がする。



あと、包括表記や末尾ifは気持ち悪い。英語ネイティブにはどうか見えるか知らないが、無理に自然言語として読めるようにしてるっぽいのが気持ち悪い。

doSomething value for value in values when value not in outerValues

とか書けちゃうのは気持ち悪い極みだ。
どれがキーワードで、どれが関数・変数なのか。構文はどこまでがグループになって解釈されるのか、全然わからない。

for value in values
  if value not in outerValues
    doSomething(value)

でいいと思う。
あと、前述のは使わなければいい話だが、「?」を未定義確認演算子に変更したせいで三項演算子が使えなくなってるのもいただけない。

value = ( if cond then 1 else 2 ) #  CoffeeScript
value = ( cond ? 1 : 2 );         // JavaScript



あとは、純粋にCoffeeScript側に責任があるとは言いづらいが、単純な構文ミスでひっかかることが多かった。
pythonと違って if が1行で書くかどうかによって構文変わるし。