kmizuの日記

プログラミングや形式言語に関係のあることを書いたり書かなかったり。

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を考えると使い勝手が下がるので難しいところです(もちろん多数の先行研究があるのは承知の上ですが、とりあえずしばらくはテキトーに実装してみて、つまづいたら先行研究を参照しようかと思います)。