Clover2開発日誌

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

when式を入れました。

version 3.2.3 リリース 2017/12/4

when式が入りました。

a := 123;
when(a) {
   1 {
       println("1");
   }
   2,3 {
       println("2,3");
   }
   123 {
       prinntln("123");
   }
   else {
       println("else");
   }
}

a := "ABC";
when(a) {
   "ABC" {
       println("ABC");
   }
   "DEF","GHI" {
       println("DEF or GHI");
   }
   else {
       println("else");
   }
}

ユーザークラスの場合IEqualableインターフェースが実装されている必要があります。equalsによって値を比較しているためです。

バグフィックス

version 3.2.2b リリース 2017/12/1

'{'や"...{..."などがあると正しくコンパイルできないバグを修正。なんで、こんなバグが残っていたんだろうroz

 

最近は僕もClover2ユーザーとなっています。バグに遭遇したら修正していきます。とりあえず、パーサコンビネータを作っていってます。CLParser.clclです。あとはLispProlog辺りを実装したいと思っています。完全に安定したらversion 4.0.0としてリリースしたいと思ってます。Windowsと同じでversion 4.0.0で安定させたかったんですよね、、、。それまで自分で使っていって使いづらい点は修正したりバグフィックスしていきたいと思います。とりあえず、今はswitchが無いのが不便だと思ったので、Kotlinのwhenの実装を考えてます。

フィールドのselfの省略

version 3.2.2a リリース 2017/12/1

フィールドのselfの省略にバグが有りました。修正。

version 3.2.2 リリース 2017/12/1

同一クラスのフィールドのself省略

> vim InternalFieldTest.clcl
class InternalFieldTest {
    field:int;
    def initialize(value:int) {
        field = value;
    }
    def get(): {
        return field;
    }
}
> vim a.cl
a := new InternalFieldTest(123);
Clover.test("internal field test", a.get() == 123);
> clover2 a.cl
internal field test...OK

上記のような感じです。ローカル変数とフィールドとの名前空間がバッティングしますが検索のアルゴリズムはローカル変数が優先されるので、曖昧な時はフィールドにselfを付けてください。このアルゴリズムで、selfは省略しても特に問題ないと判断しました。今までのコードとも互換性があります。

version 3.2.1リリース

同一クラスのメソッドのself省略

> vim InternalMethodTest.clcl
class InternalMethodTest {
    def initialize() {}
    def method():int {
        return method2();
        # return self.method2()と書いても良い
    }
    def method2():int {
        return 123 
    }
}
> vim a.cl
a := new InternalMethod();
Clover.test("internal method test", a.method() == 123);
> clover2 a.cl
internal method test...OK

上記のような感じです。フィールドの方はselfは省略できません。エディッタでのフィールド名の置き換えで便利なので。あとはローカル変数とフィールド名がバッティングするのは良くないと思うためです。