Clover2開発日誌

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

色々便利に

sortable_list{1,2,3}がslist{1,2,3}, equalable_list{1,2,3}がelist{1,2,3}と省略できるようになりました。sortable_array, equalable_arrayも同様です。

 

a := 123; "a is \{a.toString()}"がa := 123; "a is \{a}"と書けるようになりました。(toStringが自動的に呼ばれる)

 

後メソッドブロックの型推論についてはwikiに書いたとおりです。メソッドブロックの引数は省略するとit, it2, it3, it4,...となります。戻り値も推論されます。メソッドブロックの戻り値にはreturnが必要なくなりました。(戻り値の型も推論されます)

 

slist { 1,2,3 }.each { it.toString().println() }

a:SortableList<String> = slist { 1, 2, 3 }.map { it.toString() }

 

のような感じです。

 

一応上記の変更は後方互換性があるので、今までのソースを変更する必要はありません。ただ、便利になっただけです。

 

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

 

それでは、enjoy programing!

メソッドやlambdaのreturn文の省略

前から特に意図無く入っていた機能ですがメソッドやlambdaのreturn文は省略することができます。

 

class ClassA {

  def initialize() {}

  def get():int {

    123;

  }

}

 

a := new ClassA();

a.get() == 123

は真です。

 

lambdaも戻り値を指定した場合は最後に実行された値が戻り値になります。

 

a := lambda(): int { 123 }

a() == 123

 

ただしlambdaの場合は戻り値を省略した場合はreturn文が必要となります。(型推論で必要になるためです。)

 

a := lambda() { return 123 }

a() == 123

 

となります。

delegateを入れました。

delegateを入れました。

 

class ClassA {

  def initialize() {

  }

  def show() {

    println("HELLO delegate");

  }

}

 

class ClassB {

  field: delegate ClassA;

  def initialize() {

    self.field = new ClassA();

  }

}

 

a:ClassB = new ClassB();

a.show();

 

みたいな感じです。

また詳しくwikiに書きます。移譲は継承の代わりにもなります。

Clover2には継承はありませんが、移譲が代わりとなってくれるでしょう。

def showはClassBで定義されているのでインターフェースにも代入できます。

移譲のメソッドが衝突した場合は後にdelegate指定したフィールドが優先されます。もし先に定義したフィールドを優先したい場合はそのようなメソッドを定義すれば、そちらが優先されます。

 

これは誰の真似でもなくて僕自身のアイデアです。もう、そのような機能を入れた言語はあるかもしれませんが。

継承に対する重要な切り札です。継承は悪です。移譲こそ、継承より上の概念です。

 

それでは。

enjoy programing!