C Sharpens you up

http://qiita.com/yuba に移しつつあります

AngularjsがHaxeから扱えない理由

AngularjsはJavascript(以下JS)でリッチクライアントを書くためのMVCフレームワークです。JS MVCフレームワークはいま混戦状態で決定版はどれといいにくい状態ですが、確実に三強の一角ぐらいは占めていますね。

Angularjsについてもう少し知りたい場合はこちらのプレゼンテーションなどを。

さてそのJSは、今となっては人手でコーディングするには生産性が低すぎるから別のもっと良い言語からコンパイルして生成するようにしようぜという流れになっており、その「別のもっと良い言語」のことはAltJSと総称します。Haxe(ヘックス)はその代表格、その他にもCoffeeScript、TypeScript、Dart、JSXなどいろいろ個性ある言語がひしめいています。

当然、Angularjsを使ったアプリケーション開発でも、コード部分はJSでなくAltJSで書きたくないですかというのは当然の欲求で、実際にAltJSの採用例は多く、AngularJSと組み合わせるのに人気なのがTypeScriptです。TypeScriptはJSにクラスと静的型付けを盛り込んで正常進化させたと表現すべき言語でJSコードに上位互換性があり、なによりコンパイル結果として出力されるJSコードが素直で既存JSライブラリとも連携を取りやすいという利点があります。だから人気はうなずける。

でもHaxeもすごい言語。JSにクラスと静的型付けを盛り込んで(というよりはそういう位置づけのActionScriptを)正常進化させたものという点ではTypeScriptと似ているけど、Haxeは型体系がやばい。美しい。Enumが列挙体の枠をはるかに超えて代数的データ型になってしまっているって何言ってるのかわからないと思うので「Haxe Enum」でぐぐって検索結果の最初の10サイトを読んでみてくださいおもしろいから。

そのHaxeでAngulrajsの開発はちょっと無理

その美しいHaxeでクライアント開発したいな、Angularjsの開発できないかなと「Haxe Angularjs」でぐぐってみると全然これが引っかからないのですね。おかしい誰もやっていないなんてわけがないのに。

Haxeはちょっと前までは「出力されるJSコードが独自性強すぎてJSコード資産にならない(既存JSライブラリとも連携しづらい)」と言われていました。しかしHaxe 3.0になってからの出力コードは素直そのものでTypeScriptにも引けを取っておらず、これがAngularjsとの連携を阻んでいるということはありえません。

仕方ない、自分で書いてみるかと書き始めてみて、Angularjsを利用できない理由を理解しました。そうここまでが前振り。

Haxeはキーワードに$の文字を使えない

Angularjsはメソッド名や引数名に$の文字を多用していますが、これがHaxeのプログラム中で使えない文字なのです。HaxeはJSコードを出力するとき@:exposeアノテーションによってクラス名だけは別名出力させることが可能ですが、この@:exposeアノテーションはクラスにしか使えず、メソッド名だとか引数名だとかには適用不可能です。

引数名に関してはAngularjs側にも
http://js.studio-kingdom.com/angularjs/guide/di#1
$injectアノテーションという引数名変更に追従する仕組みがあるのですが、名前通りこの$injectというプロパティがすでに$の文字を含んでいたりして、やはりHaxeからは記述できません。結果として、$injectアノテーションの埋め込みをJSでべた書きすることになります。

引数だけでこれなのに各メソッドの名前もやはり問題となると… 使えませんねこれはとなるわけです。