D 言語スレでもちょくちょく言及される、Stdout("hoge")(4)(3).newline;
といったものの気持ち悪さを JavaScript でも味わうべく、似て非なるものを作ってみた。JavaScript で奇妙なことをしてみたかったので。
function strangeOutput(){ var f = arguments.callee; if(typeof(f._buffer) == "undefined"){ f._buffer = ""; } if(arguments.length){ f._buffer += Array.prototype.slice.call(arguments); // JS 1.6 ならばこれでよい // f._buffer += Array.slice(arguments); } else{ print(f._buffer); delete f._buffer; } return f; }
という関数を用意しておく。strangeOutput
を呼び出すと strangeOutput
自身を返すわけだが、この関数を引数付きで呼び出すとその引数が文字列としてバッファに蓄えられ、引数なしで呼び出すとバッファに蓄積された文字列を出力し、バッファを空にするというのが概観。
バッファとして static 変数のようなものを作ったが、delete
してまた作り直したりしなくても、関数の外で strangeOutput._buffer = "";
としておいて、バッファをクリアしたいときには delete f._buffer;
ではなくて f._buffer = "";
とすればよさそうだが、なんか嫌だったので複雑さが増している。
実行例を示す。
strangeOutput(3)(".")(1, 4, 1, 5)()("9")([2, 6], 5)()("!!"); var hoge = strangeOutput("??"); hoge();
とすると、順に 3.1,4,1,5
、92,6,5
、!!??
と表示されるはず。気持ち悪さを味わってもらえただろうか。