ヨーキョクデイ

100% pure impurities, which may imply some value. (j は虚数単位)

Tango の Stdout のような出力関数を JS で・その 3

前回 の続き。
もう少しカオス度を上げるために、関数にゲッタを付けるよ。

var strangeOutput = (function(){
    var buffer = "";
    var f = function(){
        if(arguments.length){
            buffer += Array.prototype.slice.call(arguments);
            // JS 1.6 ならばこれでよい
            // buffer += Array.slice(arguments);
            return f;
        }
        return f.flush;
    };
    f.__defineGetter__("flush", function(){
        print(buffer);
        buffer = "";
        return this;
    });
    f.__defineGetter__("newline", function(){
        buffer += "\n";
        return this.flush;
    });
    return f;
})();

D 言語ではゲッタ・セッタのための構文糖衣、つまりスイーツ(笑)の一種があって(C/C++に疲れた人のD言語 - ...ing wiki)、例えば引数なしの関数をゲッタとして使用するときは括弧を付けずにその関数を呼び出せるようになっている。tango.io.Stdout では flushnewline というメソッドがあるのだが、サンプルコードでは括弧を付けずにゲッタ的に書かれているので、今回は JavaScript でもゲッタを使ってみた。flushstrangeOutput を引数なしで呼び出したときと同じ役割をするものあって、つまり、バッファを書き出してクリアするもの。newline も同様だが、書き出したときに最後に改行を入れる。

strangeOutput(3)(".")(1, 4, 1, 5).newline("9")([2, 6], 5)()("!!");
var hoge = strangeOutput("??");
hoge.flush;

とすると、順に 3.1,4,1,5<改行>92,6,5!!?? と表示されるはず。
そろそろフォーマット周辺に手を付けてみたいが、泣くことになりそう。