Clover2開発日誌

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

クラスの検索ルーチン

version 3.2.9

クラスファイルの検索ルーチンにバグがありました。かなり致命的なバグでした。ダウンロードお願いします。ほとんど正常にコンパイルできない状態でした。ダメダメですね。しばらくJITをまともに動かせるようにする作業に入ります。今でも十分まともですがテストコードがJITでは動いてません。テストコードがJITで全部動ける状態としてversion 3.5.0としてリリースしたいと思います。しかし、このバグは致命的です。なぜ気づかなかったのか。もしくは誰か知らせてくれなかったのか、悔やまれます。

version 3.2.9リリース

version 3.2.9

オブジェクトに型情報が入りました。new Array<String>().className().equals("Array<String>")は真です。

 

しばらく、JITの安定化に力を入れます。テストコードがほとんどネイティブコードでは動いていなかったためJITに幾つかバグが見つかってます。とりあえず、テストを全部クラス化して、テストをネイティブコードで行ってみます。JITが安定したら、version 3.3.0かもしくはversion 3.5.0としてリリースしたいと思います。

 

その後はパターンマッチング、Thread, Socket辺りを入れて、Clover2でパーサコンビネータLispを実装してバグが無いと判断したら、version4.0.0としてリリースする予定です。version 4.0.0で一応は完成とします。REPLのバグも注意してなくしたいと思います。version 4.0.0はWindowsで言うNT4.0という感じですね。一応の完成形です。その後はちまちまとC言語のライブラリをClover2から使えるようにしていく作業を続けるくらいです。version4.0を楽しみにしてください。

version 3.2.7リリース。パターンマッチングを実装していってます。

version 3.2.7

whenの仕様が変わってます

whenにwildcardを入れました。

 > vim PaternMatching.clcl

 class PatternMatchingTest
 {
     value1: int;
     value2: String;

     def initialize(value1:int, value2:String) {
         self.value1 = value1;
         self.value2 = value2;
    }$

    def equals(right:PatternMatchingTest):bool {
        return self.value1 == right.value1 && self.value2.equals(right.value2);
    }
 }

 class PatternMatchingTest2
 {
      value1: Integer;
      value2: String;

      def initialize(value1:Integer, value2:String) {
          self.value1 = value1;
          self.value2 = value2;
      }$

      def equals(right:PatternMatchingTest2):bool {                                                            
          return self.value1.equals(right.value1) && self.value2.equals(right.value2);
      }$
 }$

 > vim a.cl
 a:Anonymous = "ABC";

 c:String = when(a) {
      is String {
           a;
      }
      else {
           "else";
      }
 }

 Clover.test("Pattern matching test", c.equals("ABC"));

 b:Anonymous = new Integer(123);

 d:String = when(b) {
     !is String {
         "111";
     }
     else {
         "else"$
     }
 }

 Clover.test("Pattern maching test2", d.equals("111"));

 e:Anonymous = new PatternMatchingTest(111, "ABC");

 f:String = when(e) {
     case new PatternMatchingTest(111, "ABC"): {
          "ABC";
     }
     else {
         "DEF";
     }
 }

 Clover.test("Pattern matching test3", f.equals("ABC"));

 g:Anonymous = new PatternMatchingTest(222, "DEF");

 f = when(g) {
     case new PatternMatchingTest(111, "DEF"): {
         "ABC"
     }
     case new PatternMatchingTest(222, wildcard): {
         "DEF";
     }
     else {
         "GHI";
     }
  }

  Clover.test("Pattern matching test4", f.equals("DEF"));

  i:Anonymous = new PatternMatchingTest2(123, "ABC");

  j:String = when(i) {
       case new PatternMatchingTest2(wildcard, wildcard): {
            "ABC";
       }
       else {
            "DEF";
       }
   }

   Clover.test("Pattern matching test5", j.equals("ABC"));

ただし、wildcardはプリミティブ型には代入することができないので、wildcardを使いたい時はintクラスじゃなくてIntegerクラスなどを使ってください。