« 電卓 | Main | 今日のシンコーシン »

2007.11.03

中はLISPです

Higher-Order Perl、chap3から。

メモ化の話
少し前に流行った、fib関数をメモ化して速度を上げる話。
普通にいろんな実装方法を説明した後、どうやって一般化するかでMemoize.pmの紹介がある。

Perlだと メモ化を個人で実装する必要はなくて、
use Memoize;
memoize 'fib';
で関数fibをメモ化できる。この本では、紹介だけでなくMemoize.pmの動きをちゃんと説明している。Memoize.pmはPerlの内部テーブルを書き換える話をした後に、closureが来る。

どうみても、Lispです。
Padというのは、ローカル変数のbindingを行うデータ構造で、StubはPerlのjargonではCV(code,value)と呼ばれる。carが手続き(code)をさして、cdrがpad(ローカル変数のbinding)を指すと説明が入る。Perlでclosureが作られるとその数だけCVが作られる。普通にbindとか、lexical closureとか単語が飛び出し、ここだけ読んだらPerlの本とは思えない。SICP実践編って感じだ。銀行口座よりも、メモ化で高速にする方が面白い。

気がついたんだけど、Pythonとかanonymousなんちゃらの概念がある言語って同じ仕組みになっている気がする。ということは、gccもPerlもRubyもPythonも中はLispでできているんじゃね?Lispはあまり普及していないっていうけど、見えないところにLispの根ってのががっちり蔓延っていて、僕たちは毎日Lispを無意識に使っているんですよ。

あとは、将来言語設計に進みたい人はLispってのが避けて通れないと思った。

|

« 電卓 | Main | 今日のシンコーシン »

Comments

ああ、一番下の黄色(&fib)の中身が間違っている。

my ($month) = @_;
if ($month < 2) { 1 }
else { fib($month-1) + fib($month-2); }

です。メモ化する前のfibですね。
ここで、再帰によるfibの呼び出し先が、ちゃんとメモ化されたfibを呼び出さないと行けないので、Perlの内部テーブルを書き換える必要がでてくる。

興味ある人は、ここで雰囲気だけつかんで、本を買ってください。

Posted by: なつたん | 2007.11.04 08:57 AM

The comments to this entry are closed.

TrackBack


Listed below are links to weblogs that reference 中はLISPです:

« 電卓 | Main | 今日のシンコーシン »