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するのちょっとまって!」って言ってたんですが、そろそろ触ってもらっても大丈夫な感じになってきました。とはいっても、型カバレッジ情報出すのにまたガリッと書き直す(書き足す)予定があるのですが…

これから何を実装する予定かはここに書いてあります。

Issues · mizchi/TypedCoffeeScript