Klassic開発日誌(2016/10/08):型チェックはじめました
冷やし中華はじめました、みたいなこと書いてみたかっただけです。はい。
これまでKlassicでは、メインのインタプリタは(あとで静的型をつけることを意識しつつ)動的型言語でしたが、少しずつ静的型を加えていっています。現在のところ、まだ多相型を扱えないという制限はあるものの、
val x = 1 // xはInt x = 2 // 再代入不可 mutable y = 1 // xはInt y = 2 // 再代入可能 val list = new ArrayList list.add(1) list.add(2) list.add(2) println(list) // リストリテラル。[1, 2, 3] println([1 2 3]) // [1 2 3] println([ 1 2 3 ]) // [1 2 3] val map = #["key": "value"]// マップリテラル。 println(map)
などのコードが動きます。多相型が必要なところは現在Dynamic
という型を導入することでごまかしています。階乗を計算するコードは、
def fact(n) = if(n < 2) 1 else (n * fact(n - 1)) println(fact(4))
のように書けますが、今のところ引数の型宣言を省略するとDynamic
になるというなんとも微妙な仕様になっています。
また、substring
関数の型は(Int, Int) => Dynamic
のようになっています。この辺はJavaとのinteroperabilityを考えつつ慎重に設計したいところです。ただ、Klassicの開発目的の一つとして、サブタイピングの適切な制限というのがあって、その辺は、Javaとのinteroperabilityを考えると使い勝手が下がるので難しいところです(もちろん多数の先行研究があるのは承知の上ですが、とりあえずしばらくはテキトーに実装してみて、つまづいたら先行研究を参照しようかと思います)。