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

altjs武闘会で得られた知見 あるいはTypedCoffeeScriptの進捗と、TypeScriptリファレンスについて

vvakameさんに誘われて、どのAltjsが最強か殴りあう会合に参加してきた。

当日の資料やどんな様子だったかはこちら。

で、TypedCoffeeScriptについて発表してきた。自分の発表資料はこれ。

基本的な思想とコードを載せてるので、TypedCoffeeScript気になる人はここに載ってるとおりに遊んだらいいと思う。

小学生並みの感想

遅刻しました(完)

自分の発表は淡々としすぎてたのでもっとネタに走ればよかった。でも

Altjsのモチベーションは型システムへ

ぶっちゃけ構文拡張程度のAltjsはもう皆飽きてて、coffeeでお腹いっぱい感があった。動的型付けのaltjsは、他の動的型付け言語の変換ぐらいしかもう目がないような気がする。

で、後半のパネルディスカッションで、パネラーとしてmzpさんと__gfx__さん呼んじゃったせいもあるんだけど、型システムの話にすごい寄っていった。パネラー勢がHaskellや型システムやLL(k)再帰下降パーサとかの話を前置きなく話しちゃったので、会場の一部がポカンとしてたことだと思う。反省してまーす

Altjs作成入門は、今日の話の中では @h_demonさんの この記事がよくできてた。

Webは型がほしい

やはり大規模化で型がほしいという需要が強く、そうなると既存のDOMやライブラリに対してどう型を付けるか?が主な関心事であり、ここに何か次の世代の目がある。

gfxさんいわく、ブラウザごとでDOM APIの型が違ったりするらしく、JavaScriptの自由な振る舞いとは別に仕様レベルのきつさもあるとのこと。

jsxはw3cのWebIDLをベースにネイティブAPIを生成していたらしい

Web IDL

こういう規格になってる話は大事だと思うんだけど、いかんせん使われてないってのが問題で、現実は borisyankov/DefinitelyTyped を使うことになるよねって話だった。

TypedCoffeeScriptもこれに対応する予定はある。

とはいえ、常にAltjsが必要かというとそんなことでもなく、規模にもよる。1000行超えたらAltjsの採用を考えてもいいよね、という話に落ち着いた気がする。

モナド

モナドは単なる自己関手の圏におけるモノイド対象だよ。」

とは何か置いといて、プログラミング言語にとってのモナドとは、

って言った時、mzpさんがそうだよ!そうなんだよ!って同意をもらえたので、なんかたぶんそういうことなんだと思います。ワ~スゴーイ

今回モナドについての発表は @ruiccさんの PureScriptの話が良いかもしれない。

どのAltjsが最強でしたか?

最強の型システムを持つ定理証明器のIdris(のJS出力)でした。ただし人類には使いこなせない模様。

belive_me

面白かった発表

Elmのプレイグラウンドのデモが最高だった。elmってのはHaskellっぽい文法+FRPライブラリのaltjsなんだけど、マリオみたいな何かのジャンプのイベントログをとって、任意の状態を復元したり、アニメーション中に突然重力係数の値を変えるとリロード無しで即座に反映されていた。

Playground/Examples/Mario.elm at master · jcollard/Playground

Elm、Haskell的な構文とFRPが一体化してて気持ち悪いと思ってたんだけど、ある種のFRPを実現するためには参照透過性を保持しつつ遅延評価を捨てないといけなくて、これしかない!という落とし所らしい。

TypedCoffeeScript の話

Altjs武闘会でTypedCoffeeScriptの話をすることになったとき、しばらく放置しててどうしようか悩んでいたんだけど、代休たまってたしこの際だから、ほぼゼロから内部を書きなおすことにした。

現状v0.11.3なんだけど、拡張前の v0.9 とはほとんど別物で、かなり安定している。もちろんバグがあるのは知ってて、そこを潰していくんだけど、基本型を書かなければただのCoffeeScriptとして振る舞うので使いやすいとは思う。

詳しくは発表資料をみてください。

進捗

発表時点よりさらに進化していて、ジェネリクスを実装した。

最新v0.11.3だと、このコードがちゃんと推論されて動く。

# generics
map<T, U> :: T[] * (T -> U) -> U[]
map = (list, fn) ->
  for i in list
    fn(i)
list :: String[] = map<Int, String> [1..10], (n) -> 's'

自分でドッグフーディングしてるんだけど、あんまり凝ったことしなければ、普通に使える感じになってる。

次にやること

Generics作ったのは理由があって、TypeScriptと同等の表現力を持たないとTypeScript importerを作っても意味が無い。今からコンパイラを拡張してmoduleを移植するので、それが終わったらモジュールの参照を整理して、TypeScript importerを作れる。

クラウドファンディングしたい

ただ、この言語の開発は正直時間が掛かり過ぎるし、すごく体力を使う。動的言語の推論、大量にある文法のパターンを、AST読んで気合で1つずつ解決していくしかない。

このままだとモチベーションが厳しいので、クラウドファンディングできないか考えている。 某社さんとか某社さんが興味を持ってるのは知ってるので、僕の土日のためにクラウドファンディングから金を投げてくれたらなぁ…という淡い希望がある。

興味ある人いますか?いたら mizcki@gmail.com まで(mizckiなのは間違いなじゃないです)。ただ僕はpushされるまで一切メール見ないので、Twitterとかでpingしてもらえると。

「やる気」があったらSublime/Vimのインテリセンスとか作れると思う。

TypeScript からの影響について

これ最近よく聞かれるのだけど、僕はTypeScript嫌いではなくて、ただ記法がだるいだけ。プロダクションで使うのは全然アリだと思う。

型システムも自由気ままなJSの型を表現するのに良く出来てるし、すごく参考にしている。

で、その時に役に立つのがこの本ですよ!

TypeScriptリファレンス Ver.1.0対応

TypeScriptリファレンス Ver.1.0対応

ワ~スゴーイ!便利!vvkameさん献本ありがとうございます!正確には、献本くれよ!という名の圧力を掛けて、献本させたのが正しいんだけど、実際良い本で、僕に献本くれたのはマーケティング的にも大正解ですよ!

TypeScriptはこれから避けて通れない言語の一つになるので、今学んでおくのは悪くないことですね?

という忍殺語的な欺瞞はおいとくとして、実際、TypeScript を参考に型システムを作ってて、この本のお世話になってる部分は結構ある。とくにmoduleの名前解決とかはちゃんとした資料(この本みたいなね!)一通り読まないとよくわからない。

というわけでTypeScriptリファレンスとTypedCoffeeScriptをよろしくお願いします