TypedCoffeeScriptに構造体宣言と関数型を追加した
[注意] まだまだ全然使いものにならないよ!
プロジェクト名をリネームした mizchi/TypedCoffeeScript https://github.com/mizchi/TypedCoffeeScript
構造体と関数リテラルを追加した。今は次のコードが通る。
struct Point { x :: Number y :: Number } p :: Point = {x: 3, y: 3} f :: Number -> Number = (n :: Number) :: Number -> n * n console.log f 4
f の関数型のところはわざと冗長に書いている。正直、型アノテーションを通すパーサが書けただけで推論は全然完璧ではない。 宣言済みのプロパティに代入しようとした瞬間だけバリデーションしている。関数型も返り値が一致しないと代入できないようにはなってる。引数チェックはまだ。
何が動いてて何が動いてないかは TypedCoffeeScript/test/type.coffee at type · mizchi/TypedCoffeeScript https://github.com/mizchi/TypedCoffeeScript/blob/type/test/type.coffee を見てください。
coffee-scriptのサブセットスーパーセットという哲学は守っていて、上のコードはもちろん、普通のcoffee-scriptは全てコンパイルがとって実行できるのは維持している。じゃないと作る意味が無いので。
その他もろもろ
本当は :: じゃなくて : を使いたいけど、: はハッシュリテラルの文法とぶつかりまくって諦めた
— 性格は糞 (@mizchi) 2013, 10月 17
TypeCoffeeScript, まだとりあえず仮推論しといて、推論崩れた瞬間にもしユーザーが明示的に指定した型が混ざってなければ諦めてAnyで返す、みたいな実装になってる
— 性格は糞 (@mizchi) 2013, 10月 17
あんまり完璧に推論することを目指してない
— 性格は糞 (@mizchi) 2013, 10月 17
動的言語なのでコンパイラじゃなくて言語とそれを使う側が型に対するアドバンテージ持ってる、というスタンスでいる
— 性格は糞 (@mizchi) 2013, 10月 17
持論としては未来の言語はひとつの言語でサブセットとしてコード規約の制限を加えることで言語内でターゲットを変えることができるようになるべき、と思ってるので、シンボルに対する型推論率100%のときのみネイティブにコンパイルできる、みたいな機能があると心ときめくじゃないですか
— 性格は糞 (@mizchi) 2013, 10月 17
節操ないので d.tsも読めるようにするか
— 性格は糞 (@mizchi) 2013, 10月 17
TypedCoffeeScript、README ちゃんと書いた。 https://t.co/PUhDPlFrbj
— 性格は糞 (@mizchi) 2013, 10月 17