読者です 読者をやめる 読者になる 読者になる

TypedCoffeeScript進捗どうですか(3)

今日時点までの実装点。

メンバーアクセス作った時点でひと通り動くような気がして、試し切りしようとしてライフゲームを書こうとしたら、Array周り全然未整備だったのに気づいてまたガリッと書いたりしていた。

新規機能

Array対応

line :: Number[] = [3,4,5,1]
line2 :: Number[] = [3,"fdfd",5,1] #=> error

仕様としては Generics 導入できたらその時点でArrayエイリアスにするつもり

メンバーアクセス時の型推論と代入時例外

x :: {n :: Number} = {n : 3}
x.n = "hoge" #=> error
y :: {n :: Number} = n: x.n

変数のIdentifierに記憶された型情報を返せるようになった

ForIn文の型推論と代入時例外

line :: Number[] = 
  for i :: Number in [1,2,3,4,5]
    i

line2 :: Number[] = ("" for i :: Number in [1,2,3,4,5]) #=> error

coffeeのforはarrayを返すので、左辺に型がある場合、最後のブロックの最後のexpressionの型が一致しないといけない。

※ Rangeリテラル( [1..10]) はまだ未対応(どうせすぐできる)

if文の型推論と代入時例外

x :: String = if true then "hoge" else "fuga"
err :: String = if true then "hoge" else 1 #=> error

TODO

  • ForOf(昨日ForInできたのですぐ)
  • Functionの推論(return考慮しなければすぐ)
  • switch文の型推論と代入時例外
  • 複数ファイル間での型情報共有
  • プリミティブ型のアクセス可能メソッドを定義(typescriptでいう d.ts)
  • Generics

内部的な話

  • 型チェッカーを別モジュールに切り出してif推論やarray推論のテストコードを足す
  • annotationをクラスに
  • リファクタ
  • hoge? とか 即時関数の対応強化(テスト追加)

今考えてるジェネリクスの仕様

Hoge的な型変数を受容する型を作る。

struct Enumerable<T> {
  next :: () -> T
  content :: T[]
}

あまり複雑なことはしない。自由すぎるメタテンプレートは破滅を呼び込む。

今のところの予定としては、

Number?はNullableエイリアスにする(まだNullableがないが) Number[]は Arrayエイリアス

undefinedをnullableな値に含むかがまだ迷っているところ。null or 値 という型に対してundefinedが代入された時に例外を吐くか?

今のコードについて

汚い。 正直まだガリガリ書いてる段階なので、Fork me plzとはいえない。雑にデバッグコード埋め込みながらコード書いてるので、絶対コンフリクトする。ほぼ毎日コード更新されてる。

Issueの登録や機能追加案は歓迎。 ただ、今の時点だと @pasberthさんが機能追加してくれた。

Add type expression of pair, triple, n-tuples. by pasberth · Pull Request #1 · mizchi/TypedCoffeeScript https://github.com/mizchi/TypedCoffeeScript/pull/1

add :: Number * Number -> Number = (x, y) -> x + y

と書けるようになった。* のシンボルはあとで変えるかも。

営業タスク

Node学園の打ち上げで @Constellation さんや @muddydixon さんと話してきて、暇だったらコミットしてくださいみたいな話した。