TypedCoffeeScript v0.8.1 リリース
大量にダーティハックが残ってますが一応使えるやつとしてリリースしました。 数字が中途半端なのは、v0.8で仮リリースするつもりだったけど、v0.8.1でかなり修正したからです。
まだまだ仕様はテストコード読めって感じですが、試験的に使う程度にはどうにかなるはずです。
TypedCoffeeScript/test/type_checker.coffee at master · mizchi/TypedCoffeeScript
何も型情報書かなければ、元のcoffee-scriptなら通すはず。現在は、結構な分量のcoffee-scriptで書かれているcoffee-script-reduxのコードを、typed-coffee-scriptでコンパイルできています。
自分の中でのこのバージョンの位置づけは、この0.8がアルファリリースぐらいで、0.9でベータ。1.0でプロダクト利用可ぐらいのイメージです。
インストール
$ npm install -g typed-coffee-script
実行
$ tcoffee hoge.coffee
$ tcoffee coffee> i :: Int = 3
実はまだ複数ファイル対応してなくて、一つのファイルにconcatして tcoffee --js < all.coffee > all.js
すれば成功するはずですが、基本的には次に紹介するgruntプラグインをおすすめします
grunt-typed-coffee-script
mizchi/grunt-typed-coffee-script
$ npm install -g grunt-typed-coffee-script --save-dev
使い方はリードミーにて。さっくり使いたい場合は次のプロジェクトをcloneするのが楽です。
Sample project
TypedCoffeeScriptを使ったほぼ最小構成の grunt プロジェクト
mizchi/sample-typed-coffee-project
使い方
$ git clone https://github.com/mizchi/sample-typed-coffee-project.git $ npm install $ grunt typedcoffee
src/以下に置いたファイルがTypedCoffeeScriptコンパイラを用いてコンパイルされます 型情報はファイル実行順に依存してます
既知のバグ
report is not defined
一部の型エラー検出時、型エラーの旨ではなく report is not defined と言われる。 コード中のreportをgrepしても見つからず、理由がよくわからないので調査中…。本気でやればすぐ終わるはず。 追記(1384851220943):修正しました。宣言済みの型に対する再代入でタイポしていたみたいです。
struct宣言がゴミコードを残す
これかなり手抜きで Intトークンをハックしていたので、structが推論された場所には 3; とかそういうコードが残ってしまう。
これによってコードの挙動が崩れることはないだろうが、キモいのであとで直します。
CoffeeScriptRedux 由来のバグ
そもそも coffee-script-redux と jashkenas/coffee-script のパーサーに違いがあって、些細な違いだけど、元のcoffeeを通すという趣旨には反するので、どうしようか考え中。
coffee-script@1.7 で大丈夫だが redux で落ちるケース
{ a b c } = require 'hoge'
redux/typed-coffee-scriptではケツカンマが必要
{ a, b, c } = require 'hoge'
余裕があれば本家にPR出して対応したい。 (typed-coffee-scriptにおいては分割代入の推論はまだなので、あとでやります…)
v0.8.1での機能
Int, Float, Number
Int, Floatが型宣言で使えるようになりました。 コード中に明示されてる限りは推論して、壊れた時に警告出すようにしました。
型の前置宣言
っていうんだっけ?これ。
f :: Int -> Int f = (n) -> n * n
Haskellっぽいですね
クラスフィールド
class X num :: Number constructor: -> @num = 3 x :: X = new X
クラスに型情報つけれるようになった。クラスフィールドで宣言した型の前置宣言は、thisに紐付けられます。継承されると継承先は型情報を引き継ぎます。
型情報だけを継承する class X implements Point を実装したいんですが、パーサ書きにくくて後回し。
Fork me plz!!!
興味持ってくれた人に「まだ自分がガリガリ書き換えてるので、Forkするのちょっとまって!」って言ってたんですが、そろそろ触ってもらっても大丈夫な感じになってきました。とはいっても、型カバレッジ情報出すのにまたガリッと書き直す(書き足す)予定があるのですが…
これから何を実装する予定かはここに書いてあります。