もう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
このブログにコメントするにはログインが必要です。
さんログアウト
この記事には許可ユーザしかコメントができません。