2009/08/24

Jsのfunctionで暇つぶし(ejax)

またもや眠気覚ましに少し遊んでみた。

意味のあるコードではない。

 

いつまでたってもScheme初級者から抜け出せない私はJavaScriptよくで遊ぶ。

 

functionはもうちょっと短くfunくらいにならないかな。まぁ改めてみるとlambdaもなかなか冗長だな。^でいんじゃね。

 

ところで、ejaxとjs2-modeはやはりかなり良い。この二つが完全に連携してくれると助かるけどなー。

(ejaxはemacs lispで書かれたECMA標準に準拠したJavaScriptインタプリタ)

 

download - 10times.recursive.helloworld.js

 

普通の再帰

(function f (n){
   if (0 < n)
   {
     print("Hello, world !");
     f(n - 1);
   }
})(10);

 

マッチポンプ的な再帰に変換。自分に自分を呼び出す自分を渡して・・・

(function (f){
   f(f, 10);
})(function (f, n){
      if (0 < n)
      {
        print("Hello, world !");
        f(f, n - 1);
      }
    });

 

リテラルを一つ外にくくりだしてみる。無名関数はローカル変数の変わりになるというあれ。Schemeのletはlambdaでくくり出すのと同じだよーっていうあれ。

(function (x){
   (function (f){
      f(f, x);
    })(function (f, n){
         if (0 < n)
         {
           print ("Hello, world !");
           f(f, n - 1);
         }
       });
})(10);

 

出力を行う部分を関数として外に出してみる。この辺から後はとくに面白みがない。

(function (y, action){
   (function (x){
      (function (f){
         f(f, x);
       })(function (f, n){
            if (0 < n)
            {
              action(n);
              f(f, n - 1);
            }
          });
    })(y);
})(10, function (v){
      print("Hello, world !");
    });

 

反復条件も関数として外に出してみる。pはpredicateのpということで。

(function (y, a, p){
   (function (x){
      (function (f){
         f(f, x);
       })(function (f, n){
            if (p(n))
            {
              a(n);
              f(f, n - 1);
            }
          });
    })(y);
})(10, function (v){
      print("Hello, world !");
    }, function(c){
      return 0 < c;
    });

 

ここで再帰のたびにデクリメントされる部分を関数として外に出したらfor文ぽいよねーなどと思いながら外にだしてみる。iはincrementのiかな。

(function (y, a, p, i){
   (function (x){
      (function (f){
         f(f, x);
       })(function (f, n){
            if (p(n))
            {
              a(n);
              f(f, i(n));
            }
          });
    })(y);
})(10, function (v){
      print("Hello, world !");
    }, function(c){
      return 0 < c;
    }, function (j){
      return j - 1;
    });

0 件のコメント:

コメントを投稿