Clover2開発日誌

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

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