メソッドのデフォルト引数 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 value...OK
上記のようにメソッドの引数のデフォルト値が設定できます。
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")) {
> it.printf("[%d]"); # itはInteger型
> }
> }
みたいな感じです。その時気づいたのですが、List<Object>に1をaddする時boxingもされずにObject型に代入できてしまうためセグメンテーション違反が出てました。ちゃんとインタフェースにはプリミティブ型は代入できないようにチェックするようにしました。またインターフェースへのプリミティブ型の代入はboxingされるようにしました。上のコードはversion 3.1.6ではちゃんと動きます。
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.field1 \{ClassA.field1}\n");
}
}
このようなコードの場合ClassA.clcl, ClassB.clcl両方のコンパイルが通りませんが以下の様にすれば大丈夫です。
> vim ClassA.clcl
include "ClassB.clcl"
class ClassA {
field1: static int;
def hello(): static {
ClassB.hello();
}
}
> vim ClassB.clcl
include "ClassA.clcl"
class ClassB {
def hello(): static {
println("ClassA.field1 \{ClassA.field1}\n");
}
}
version 3.1.4リリース
クラスの自動コンパイル機能を入れました。クラス名をファイル名に持つクラスは自動的にコンパイルされます。 例えば
> vim Hello.clcl
class Hello {
def hello() {
println("HELLO WORLD");
}
}
> vim hello.cl
Hello.hello();
> clover2 hello.cl
HELLO WORLD
のような感じです。クラス名はファイル名と同じにしておくほうが自動的コンパイルされるので便利かもしません。あとコメントを日本語で書き始めました。そのほうがしっくりきました。Clover2は日本人向けに作っていきたいと思います。
version 3.1.2リリース
Darwinでコンパイルとテストしました。一応動いている様子です。深くはチェックしません。その時クラスフィールドやクラスメソッドを呼び出すとき小文字で始まるクラスはクラスフィールドやクラスメソッドは呼べなくしました。ちょっと色々ありまして。OSXはファイル名で大文字と小文字を区別しないので、list.headなどがListというクラスのフィールドだと勘違いしてしまうバグと出くわしたので。まあ、普通クラス名は大文字から始まると思うので、このような変更を加えました。一応小文字から始まるクラスは定義はできます。小文字から始めるクラス名のクラスのクラスフィールドとクラスメソッドが呼び出せないだけです。
SystemクラスのnativeメソッドでNull pointerのチェックが甘くセグメンテーション違反してましたが、全部チェックするようになりました。と言ってもNull Pointer Exceptionが起こるようになっただけですけどね。ユーザーには何が起こったのか分かるだけでもまだマシですね。ああ、そうだ。他のnative methodのNull pointer Exceptionのチェックしてませんね、、、今からします。
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
クラスのソースファイル clc --> clcl
普通のソースファイルのコンパイル結果 clo --> ocl
クラスファイル clcl --> oclcl
大きな変更です。すみません。お手数ですが手元のソースファイルの拡張子も変更してください。拡張子を変えたのは出力ファイルをrm *.o*などと一括で消せるようにするためです。そのような要望があったので。