読者です 読者をやめる 読者になる 読者になる

素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: すかいぷ:javascripter_  か javascripter あっと tsukkun.net skypeのほうがいいです

関数を返す関数と数字

javascript

追記:ページ詳細 - 関数を返す関数と数字 - 素人がプログラミングを勉強するブログ - 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

結論:普通に数値リテラルを使うべき。