Clover2開発日誌

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

version 3.2.8リリース

version 3.2.8

数値のラッパークラスのオブジェクト表現を入れました。

a:Integer = 5I;
b:UInteger = 5UI;
c:Byte = 5Y
d:UByte = 5UY;
e:Short = 5S;
f:UShort = 5US;
g:Long = 5L;
h:ULong = 5UL;
i:Float = 5.5F;
j:Double = 5.5D;

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クラスなどを使ってください。

version 3.2.5

version 3.2.5

例外が起こったときに起こったソースコード名とソースコード番号のスタックトレースが表示されるようになりました。

version 3.2.4

version 3.2.4

例外が起こったときに起こった場所が出力されるようになりました。

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の実装を考えてます。