関数を返す関数と数字
追記:ページ詳細 - 関数を返す関数と数字 - 素人がプログラミングを勉強するブログ - livedoor クリップを参考に、to_nを修正
高階関数を使えば、0以上の整数を表現できるような気がしたのでやってみる。
0が0で、(function() 0)が1。
大きい数を入れるとtoo much recursionになっちゃうから、実際は3000くらいまでしか表現できない。
function wrap(n) n && function() wrap(n - 1); function to_n(n) n && to_n(n()) + 1; function sum(a, b) a ? sum(a(), function() b) : b; function max(a, b) (function f(c, d) c ? d ? f(c(), d()) : a: b )(a, b); function min(a, b) (function f(c, d) c ? d ? f(c(), d()) : b: a )(a, b); console.log( to_n( function() function() function() 0)); // 3 console.log(to_n(wrap(4))); // 4 console.log( to_n( max( sum( wrap(3), wrap(4) ), min( wrap(5), wrap(1) ) ) ) ); // 7
結論:普通に数値リテラルを使うべき。