型付きcoffees-scriptを作り始めた

たぶん僕は人類の怠惰を極めたようなcoffee-scriptの文法が好きすぎるのだけど、その結果型を書けるcoffee-scriptを作り始めてしまった。

Fork元はCoffeeScriptRedux

mizchi/CoffeeScriptRedux https://github.com/mizchi/CoffeeScriptRedux/tree/type

とりあえず今の版だと次のコードが通る。

目標

x :: Number = 3
y :: String = "hello"
z :: Boolean = false
# z :: String = 4 #=> Error
# y = x #=> Error
a :: Any = 3
a = 'fadfa'
b = 'a'
fn :: Function = ->
  x = 3
  n = ->
    i = ''

f2 :: Function = (a :: Number) ->
  a + 3
obj :: {x :: Number, y :: Number} = {x: 3, y:3}
console.log 'finish'

ここ半年ぐらいcoffee-scriptのソース読んだり、型が書けるdeftypes.jsを作ったり、再帰加工パーサーの書き方を覚えたりしていたのだけど、これのためだった。

自分は計算機科学の教養がないので、とりあえず必要になったのから勉強した。

もちろん、型理論とかすごく疎いのでTAPLとか読みたいんだけど、一章が難しすぎてあまり読めていない。教養が足りない気がする。

いまのところ、力技で推論っぽいの実装してて、何も参考にせずテストコードを通すためだけに書いている。

動機

typescriptはいいけど、結局d.tsが提供されない限り既存のライブラリとの連携がめんどい。 既存のコードにちょっとずつ型を書き足してシンボルの型カバレッジ的なものを上げながら開発したい。たぶんそういう需要はある。 そのために元のcoffeeのサブセットとして実装し、互換を崩さないようにする。

作り始めただけであって、まだまったく完成はしていないしロードマップもない。が、とりあえずここまで動いたので、目処はついた。 作り始めましたよ、っていう報告をすることで自分を追い立てる感じ。まだまだ使い物になるものではない。