Clover2開発日誌

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

version 3.0.5d リリースしました。

やっぱりこっちもリリース情報書いておきます。twitterとの連携が便利なので。

 

REPLでほとんど期待通りの補完が行われます。メソッドブロックの型推論も含めて。結構便利なので、使ってみてください。

 

でも、まだバグがあるかもしれません。readlineのプログラミングは難しく、確認もテストを作って確認と言うより動かしてみないと分からないので。ほとんどパターンは確認したつもりですが、自分ひとりではどうしようもありません。もし、バグを見つけたら、報告が貰えると嬉しいです。連絡先はtwitterの@ab25cq宛で。

 

後確認しているバグはJITした時にメソッドの戻り値でreturn文の省略が出来ないことです。JIT無しだと省略できるんですが、JITをつけると省略できません。近いうちに修正します。

 

とりあえず、REPLが期待通りに動いて嬉しいです。例えば

slist{1,2,3}.map { it.toString().toCommand() }.each { it.less() }

なんてコードでも補完が効いちゃいます。結構凄いでしょう。

まあ、当たり前といえば当たり前ですが。動いたときは「ちょっとすごいもの作っちゃったな」なんて思ったりしましたw

 

それでは。

enjoy programing!

色々便利に

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

 

となります。