面白いので書いてみた。

そういえば、ポールグレアムクロージャでこんなのを書いてたな


function foo(n){
return function (i) {
return n+= i; } }
ハッカーと画家 p199


こんな感じで使うのだろう

function foo(n){
return function (i) {
return n+= i; } }
var add = foo(10);
var number1 = add(1); // number1 = 10 + 1 = 11
var number2 = add(2); // number2 = 11 + 2 = 13
var number3 = add(3); // number3 = 13 + 3 = 16
累積機という名前で作ってあるが、javascriptの場合は文字列の結合にも+が使えるのでこういう使い方もアリだ。

function foo(n){
return function (i) {
return n+= i; } }
var append = foo("");
var string1 = append("R25"); // string1 = "R25"
var string2 = append("今週も"); // string2 = "R25今週も"
var string3 = append("拾えなかった");// string3 = "R25今週も拾えなった"
で、手元にdate型を放り込むとstringで返すような関数があったので書き直してみた。

// もうfoo(n)は省略
function date2str(d,bsep){ // dはdate型,bsepはbool型
var append = foo("");
append(d.getFullYear());
append((bsep) ? "/" : "");
append( ( (d.getMonth() + 1 ) < 10 ) ? ("0" + (d.getMonth() + 1)) : d.getMonth());
append((bsep) ? "/" : "");
append( (d.getDate() < 10 ) ? ("0" + d.getDate()) : d.getDate() );
append((bsep) ? " " : "");
append( (d.getHours() < 10 ) ? ("0" + d.getHours()) : d.getHours());
append((bsep) ? ":" : "");
append( (d.getMinutes() < 10 ) ? ("0" + d.getMinutes()) : d.getMinutes());
append((bsep) ? ":" : "");
return append( (d.getSeconds() < 10 ) ? ("0" + d.getSeconds()) : d.getSeconds());
}
WScript.Echo(new Date(),true) // 2005/07/11 01:29:30
WScript.Echo(new Date(),false) // 20050711012930
少しlisp風な感じになる。読みづらいし、遅いけど(笑)面白い。