kuzha -> java コンパイラ

こういう kuzha のプログラムが、

for i in [1..9] do
    puts: i;
end

こういう java のクラスファイルを吐き出す。

KuzhaObject curSelf;
Iterator iter = Operation.getIterator(Operation.newRangeList(C_0, C_1, C_0));
while (iter.hasNext()) {
    locals.setSlot("i", (KuzhaObject)iter.next());
    curSelf = self;
    KuzhaObject puts = locals.getSlot("puts");
    if (!(puts instanceof KuzhaCallable)) {
        throw new KuzhaRuntimeException("cant call slot: puts");
    }
    KuzhaObject[] temp01 = new KuzhaObject[1];
    KuzhaObject temp02 = locals.getSlot("i");
    if (!(temp02 instanceof KuzhaCallable)) {
        if (((KuzhaCallable)temp02).arity() == 0) {
            temp02 = ((KuzhaCallable)temp02).call(self, new KuUserObject(), new KuzhaObject[0]);
        }
    }
    temp01[0] = temp02;
    ((KuzhaCallable)puts).call(curSelf, null, temp01);
}
return null;

冗長だなぁ……どこか削減できないものか……。getSlot の直後がいつも大変だから、getValue, getFunction のメソッドに置き換えてみようかな。

KuzhaObject curSelf;
Iterator iter = Operation.getIterator(Operation.newRangeList(C_0, C_1, C_0));
while (iter.hasNext()) {
    locals.setSlot("i", (KuzhaObject)iter.next());
    getFunction(locals, "puts").call(curSelf = self, null, new KuzhaObject[]{ getVariable(self, locals, "i") });
}
return null;

置き換えた。これなら無駄にコードサイズも増えなくて good。