Clover2開発日誌

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

2017-11-01から1ヶ月間の記事一覧

version 3.2.0 リリース 2017/11/29

関数の再帰表現に対応しました。スクリプト内のdefで関数を定義した場合再帰が出来ませんでしたが対応しています。(クラスのメソッドの再帰表現はもともとできる)

version 3.1.9 リリース 2017/11/28

setterとgetterがフィールドを定義すると自動的に定義されるようになりました。 > vim SetterAndGetter.clcl class SetterAndGetter { field1:int; field2: String; field3: private int; def initialize() {} } > vim setter_and_getter.cl a := new Setter…

version 3.1.8リリース

列挙型 > vim EnumTest.clclc class EnumTest { enum { Value1, Value2, Value3 } enum { BValue1, BValue2, BValue3 } } > vim enum_test.cl Clover.test("enum test", EnumTest.Value1 == 0 && EnumTest.Value2 == 1 && EnumTest.Value3 == 2 && EnumTest.…

メソッドのデフォルト引数 version 3.1.7

> vim ClassA.clcl class ClassA { def initialize() {} def method(a:int, b:int=2, c:int=3) { return a + b + c; } } > vim a.cl a := new ClassA(); Clover.test("Method arg default value", a.method(1) == 6); > clover2 a.cl Method arg default val…

version 3.1.6 リリース 2017/11/21

isメソッドがAnonymousメソッド以外にも呼べるようになりました。List<Object>などで便利だと思います。 > a := new List<Object>(); > a.add(1); > a.add("ABC"); > a.each { > if(it.is("String")) { > it.printf("[%s]"); # itはString型 > } > elif(it.is("Integer")) { </object></object>…

version 3.1.5リリース

version 3.1.5 リリース 2017/11/20 クラスの循環参照の問題を解決しました。 > vim ClassA.clcl class ClassA { field1: static int; def hello(): static { ClassB.hello(); } } > vim ClassB.clcl class ClassB { def hello(): static { println("ClassA.…

version 3.1.4リリース

クラスの自動コンパイル機能を入れました。クラス名をファイル名に持つクラスは自動的にコンパイルされます。 例えば > vim Hello.clcl class Hello { def hello() { println("HELLO WORLD"); } } > vim hello.cl Hello.hello(); > clover2 hello.cl HELLO W…

version 3.1.2リリース

Darwinでコンパイルとテストしました。一応動いている様子です。深くはチェックしません。その時クラスフィールドやクラスメソッドを呼び出すとき小文字で始まるクラスはクラスフィールドやクラスメソッドは呼べなくしました。ちょっと色々ありまして。OSXは…

version 3.1.1リリース

version 3.1.1 リリース 2017/11/14 ナルエイブルを入れました。 a:String = null; # コンパイルエラー b:String? = null; # nullは代入できる。bは空だということでnullを代入している。 # ただし、bはnullが入っているかどうか注意してコーディングしない…

3.0.8リリース

スクリプトの自動コンパイル機能を入れました。clファイルはコンパイルせずに直接clover2で実行できます。 > vim HelloWorld.cl println("HELLO WORLD"); > clover2 HelloWorld.cl HELLO WORLD 拡張子の変更。 普通のソースファイル cl --> clクラスのソース…

3.0.7リリース

Anonymousクラスにisメソッドを作りました。以下のように使います。 a:Anonymous = "ABC"; if(a.is("Integer")) { #aはInteger}elif(a.is("String")) { #aはString} #aはanonymous です。ちょっとプルリクエストがありましたが、マージすると謎のバグにエン…

version 3.0.6 リリース 2017/11/12

メソッドブロック関連のメモリのバグを修正しています。稀にセグメンテーション違反が起きる致命的なバグなのでダウンロードをお願います。JITでメソッドのreturn文の省略が可能になりました。これで知っているバグは全部修正できました。3.0.6を安定版とし…

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

やっぱりこっちもリリース情報書いておきます。twitterとの連携が便利なので。 REPLでほとんど期待通りの補完が行われます。メソッドブロックの型推論も含めて。結構便利なので、使ってみてください。 でも、まだバグがあるかもしれません。readlineのプログ…

ここの修正内容を書くのはやめておきます。wikiのリリースノートを見てください

ここの修正内容を書くのはやめておきます。wikiのリリースノートを見てください ということです。こちらは言語の実装予定の機能や所感などを書いていきますね、、、。

version 3.0.5リリース

version 3.0.5 リリース 2017/11/07 シェルモードが悪さをしてslist{1,2,3}.select { it > 1 }などが動きませんでしたが修正しました。コンパイラでコマンド名をPATHからサーチしてからシェルモードに入るようにしています。

モジュールのエラー表示をわかりやすくしました。

エラーが出ているmoduleの行番号が表示されます。 ちょっと今まではありえないくらい不親切でした。 修正。

色々便利に

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やブログに書き込みます。 list { 1,2 3 }.map { it.toString() }はList<String>を返します!!!!</string>

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

前から特に意図無く入っていた機能ですがメソッドやlambdaのreturn文は省略することができます。 class ClassA { def initialize() {} def get():int { 123; } } a := new ClassA(); a.get() == 123 は真です。 lambdaも戻り値を指定した場合は最後に実行さ…

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(); みたいな感じ…