Clover2開発日誌

Clover2というJavaのように静的な型を持つRubyのようなコンパイラ+仮想マシンの開発日誌です。LLVMでJITもします。https://github.com/ab25cqにて開発しています。

型推論

ブロックオブジェクトで戻り値の型を省略した場合、returnされる値によって型推論されるようになりました。ただ、Clover2の場合boxingやunboxing、プリミティブ型やユーザークラスなどがあるので、それほど便利ではありません。例えばList.mapメソッドのブロックオブジェクトの戻り値にAnonymousクラスと記述しないと、boxingされません。結局toIntegerなどと型変換のスペシャルメソッドを呼ばないといけないため期待されるほど記述が減るわけでは無いです。まあ、とりあえず、入れただけです。

 

後はAnonymousクラスにはcast("bool")などキャストスペシャルメソッドを作りました。ちょっと自分でClover2を使ってみたんですがAnonymousクラスが使いづらかったためです。

 

テスト中仮想マシンがSegmentation Faultするなど、まだまだシステムが不安定なため、しばらく機能拡張よりもデバッグに専念します。

 

ユーザーの皆様も、もしバグを見つけたらgithubのab25cq宛にメッセージを送っていただけると助かります。すぐに対応させて貰いたいと思います。フィードバックよろしく、お願いします。

 

自分で使ってみた印象ですが、ブロックオブジェクトを書くのが凄くめんどくさいため、ブロックオブジェクトが一つだけの引数の場合Rubyのような記述ができるような糖衣構文を入れたいと思います。

今日中にやってしまうかもしれません。

 

3.times() { println("HO!"); }

3.times(lambda() { println("HO!") });

と同じ記述ってことにしますかね。そのままRubyですが、、、、。

 

引数がある場合もRubyと同じ記述にしていまいます。

あとlist { 1, 2, 3 }とかもかなり記述が面倒くさいんですよね。Ruby風の方が良いんでしょうね。

なんか全体的に記述が面倒くさい気がします。

型チェックの厳密性はそのままにもう少し記述が楽にできるように工夫してみます。型チェックの厳密性は維持します。型チェックを甘くするとシステムが不安定になるので。

それだけ今日やってみますかね。