« プリプロセッサ命令#と##のメモ | Home | 「まだ結婚しないの?」に答える理論武装読了 »

September 12, 2010

GNU RとJavaScriptの無名再帰をやってみた

 例によって、なんのこっちゃわからんと言われる類の記事である。

 昨日のOSC2010 Tokyo/Fall の2次会で話題になった、RとJavaScriptの無名再帰を確かめてみた。
 まずはJavaScript。例えば5の階乗を計算する関数を書いて、

var result = function(val, n){
    if(n===0) 
	return val;    
    return arguments.callee(val*n, n-1);
}(1,5);
print(result);

これをfac.jsという名前で保存して実行してみると、

$ js fac.js 
120

正しい結果が返ってきている。ポイントは呼び出した関数オブジェクトが、変数 arguments.callee に束縛されていること。再帰は呼び出された関数をその関数内で呼び出す必要があるので、自分がどの関数なのか特定する必要がある。普通の再帰は名前が付いているので問題ないが、無名再帰の場合名前がない。そこで言語側で仕組みを用意する必要がある。ということでJavaScriptすげぇ。

 次にGNU R。同じく5の階乗を計算するコード

> (function(tmp, n){
+ if(0==n) return(tmp)
+ return(Recall(tmp*n, n-1))
+ })(1, 5)
[1] 120

すばらしい。Rの場合のポイントはRecall関数。再帰呼び出しをするための関数だ。Recallを使うことで名前を使わずに、自身の関数を再帰呼び出しすることができる。

他の言語の無名再帰については、例えばDan Kogai氏らがPerlで試みているようだ。

No TrackBacks

TrackBack URL: http://www.argv.org/~chome/blog/mt-tb.cgi/216

About this Entry

This page contains a single entry by chomy published on September 12, 2010 6:29 PM.

プリプロセッサ命令#と##のメモ was the previous entry in this blog.

「まだ結婚しないの?」に答える理論武装読了 is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.