Clover2開発日誌

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

List.mapが型チェックをするようになりました。

List.mapが型チェックをするようになりました。

 

l: List<String> = list { 1, 2, 3 }.map() {|n:Integer| return n.toString(); }

コンパイルできます。

これまで通りのAnonymousを返すコードもそのまま動きます。

一応互換性がある変更点です。

 

KotlinのList.mapの定義の美しさにびっくりして、一時期電車の中で定義をプリントアウトした紙を眺め続けて、うっとりしていました。

ようやく、Clover2でも同じものが手に入りました。

良かったら、使ってください。

 

定義はContainer.clcにあるので見てくださいね。まあ、単純な実装です。

 

それでは、enojoy programing!

method genericsを入れました

新しい機能としてmethod genericsを入れました。

def <T:Object,R:Object> method(a:T, b:R) {

}

のように定義します。詳しくはwikiで。

 

これでList.mapの記述が型チェックを行えるようになります。

まだバグがあるかもしれません。

List.mapはまだ定義してません。明日以降します。

 

それでは、enjoy programing!

LLVMのリファクタリングが一応終了

LLVMJITリファクタリングが一応終了しています。

ちょっとは読みやすくなったかと。

 

ついでにlist { 1, 2, 3 }.toString().println();がJITでは動かなかったですが、デバッグしています。

 

これでようやくKotlinに近づけるコーディングを始められます。

今のところ考えているのは

 

1. List.mapのためにクラスのメソッドのにクラス引数を渡せるようにしたいこと。(今はクラス単位でしか渡せない。その為List.mapの定義がAnonymousを使っているため煩雑になっている。)

class List<T>

{

def <T, R> map(trans:lambda(T):R): List<R>

}

 

などと定義したい。

 

2. メソッドのラムダ引数の省略。Kotlinでいうit, it2ってやつです。

 

3.times() { it.toString().println(); }

 

などと使えるようにしたい。

 

3. new 演算子の省略

 

a := List([ 1, 2, 3 ])

 

でlist { 1, 2, 3 }の代りに使えるようにする。list { 1, 2, 3 }自体は残しておきます。

 

4.型推論の強化

 

Kotlinのようにブロックを含むメソッドチェインをしたときに簡単な記述で書けるようにしたい。

 

点です。とりあえず、1から始めます。KotlinのList.mapの定義の綺麗さに感動しました。当たり前のことを当たり前のようにしているKotlinは素晴らしいです。普通なんですよね。なんか全てが。

 

 

ようやく、今日から新しいことができます。List.mapの定義がKotlinっぽくなるのが楽しみです。

 

それではenjoy progmirang!

LLVMのリファクタリング

LLVMリファクタリングを行ってます。

しばらく時間がかかります。

developリポジトリで開発しています。

シンプルなソースにしたいと思います。

具体的にはLVALUEに格納している値の種類を追加しています。

そうするとだいぶソースが整理されるので。

今まで、かなりいい加減に処理していました。

それによってLLVMのスタックの値を表示してデバッグすることができるので、後々いいと判断したためです。

developリポジトリの方が安定したら、masterにmergeしたいと思います。

バグ修正中です。

JITでlist { 1, 2, 3 }.toString().println()が動きません。只今修正中です。

少しの間JITリファクタリングします。もう少し読みやすく整理しますね。リポジトリはdevelopで作業しています。

あとデバッグ時にスタックの値が表示できないのをなんとかしたいです。デバッグのしようがありません。

 

その後はKotlinの様に型推論の強化や簡略化された表記ができるように改良していきたいです。Kotlinには衝撃を受けてます。あれこそモダンな言語じゃないでしょうか、、、、。

 

それではenjoy programing!

言語仕様の変更点

ブロックが block { a := 123 } などから { a := 123 } に変更されています。ブロックは戻り値を返すようになりました。最後に実行された式の値がブロックの戻り値です。a := { 123 }; System.assert(a == 123)は真です。
ブロックの表記が変わったので配列の表記が変わってます。 { 1, 2, 3 }から[ 1, 2, 3 ]となっています。リストなどはlist { 1, 2, 3 }から変わっていません。
if文が戻り値を返すようになりました。a := if(true) { 123}; System.assert( a == 123 )は真です。
変更申し訳ないです。Kotlinが気に入ってましてClover2をKotlinの言語仕様に近づけるため、これからもしばらく言語仕様の変更があると思います。Kotlinのような表記ができるようになったら、version 5.0としてリリースして言語仕様を固定したいと思います。申し訳ないです。

if文が戻り値を返すようになってます。

if文が戻り値を返すようになってます。JIT対応。

 

> a := if(true) { 1 } else { 2 }

> a

1

となります。JITでも対応しています。

もちろん、インタプリタでは

> if(true) { "ABC" } else { "DEF" }.[TAB]

でString型のメソッド補完も行います。

 

次はブロックでの引数の省略を入れたいと思います。itってやつですね。ブロックの引数が複数あったら、it, it2, it3とかできれば良いなと思います。ただ、Clover2はブロックの引数の型が決まっていないとメソッド探索ができないかもしれないので、ちょっとむずかしいかもしれません。もちろん探せるように修正はできるので、なんとか、Kotlinのようにブロックの引数が省略できるようにしたいです。

 

それとreturn文が省略できるようにすればかなり、メソッドチェインでKotlinのような記述ができるようになると思います。

型推論辺りも強化しないとList.mapはKotlinのようにはならないと思いますが。

まあ、ぼちぼちKotlinのような簡略化した記述ができるように修正していきたいと思います。

 

しかし、今日は夜更かししてしまいました。

明日仕事中、眠いと思います。がくり。仕事に支障が無いようにぼちぼちコーディングしたいと思います。バグが出るとついムキになっちゃいますね。

反省。

明日は早く寝ると思います。

おやすみなさい。

 

それでは。