もうfunctionの打ちすぎで腱鞘炎になりそうで、Arrow Functionも間に合いそうにないので。

基本的に404 Blog Not Found:javascript - λ表記をDSLにをより実用的にしたものです。

SYNOPSIS

log(lambda("x:x")(42)                       );  /* 42 */
log(λ("x:x")(42)                            );  /* 42 */
log(λ("n:n<=1?n:n*_0(n-1)")(10)             );  /* 3628800 */
log(λ("x,y:Math.sqrt(x*x+y*y)")(3,4)        );  /* 5  */
log(λ("x:λ(y:Math.sqrt(x*x+y*y))")(3)(4)    );  /* 5 */

もちろん本来の用法もいけますし…

/* church numerals */
var cn2num = λ("f:f(λ(n:n+1))(0)"),
succ = λ("n:λ(f:λ(x:f(n(f)(x))))"),
zero = λ("f:λ(x:x)"),
one = succ(zero),
add = λ("m:λ(n:m("+succ+")(n))"),
two = add(one)(one),
mul = λ("m:λ(n:m("+add+"(n))("+zero+"))"),
four = mul(two)(two),
pow = λ("b:λ(e:e(b))"),
sixteen = pow(two)(four);
log(cn2num(sixteen) );  /* 16 */

Arrow Functionが来るまでのつなぎとしても使えます。

log(
    [0,1,2,3,4,5,6,7,8,9]
        .filter(λ('n: n % 2 === 1'))    /* [1,3,5,7,9] */
        .map(λ('v, i: [i, v]'))         /* [[0,1],[1,3],[2,5],[3,7],[4,9]] */
        .map(λ('a: a[1]-a[0]'))         /* [1,2,3,4,5] */
        .reduce(λ('t,x:t+x'))           /* 15 */
);

自分で言うのもなんですが、なんちゃってDSLな割にかなり使い物になると思います。

Enjoy!

Dan the (Dys)?functional JavaScripter