おもしろい議論。
せっかくなのでerlangでやってみた。
$ cat fix.erl
-module(fix).
-export([fix/1, fib_maker/1]).
fix (G) ->
(G)(fun (X) -> (fix(G))(X) end).
fib_maker(F) ->
fun (X) ->
if X =< 1 -> 1;
true -> (F)(X - 1) + (F)(X - 2)
end
end.
$ erl
1> c(fix).
{ok,fix}
2> Fib = fix:fix(fun (X) -> fix:fib_maker(X) end).
#Fun<fix.x.xxxxxxxx>
3> lists:map(Fib, [1, 2, 3, 4, 5]).
[1,2,3,5,8]
Scheme版とほぼ同じになって芸がないなあ。つか、erlangってば関数型言語のくせに高階関数扱いづれー(yet still erlang much better than C)。
memoizeが目的の場合erlangだとこの方法は取らない。多分。
callerがspawnさせて、calleeがメモするのがerlang流。多分。
でもその場合はfibを壊さないとだめか。本末転倒。
追記
Erlang/2005/09/04/memoiseでメモにチャレンジしてみました。
カテゴリに無理矢理対応(wiliki-blog.scm.diff)。
WikiNameに\d\d\d\d/\d\d/\d\dが含まれたらBlogとみなすように(乱暴)。
とりあえず、permalinkは"カテゴリ/\d\d\d\d/\d\d/\d\d/タイトル"でいこう。
新しいbookmarkletはこんなの。
javascript:(function(){function z(x){if(x < 10)return "0"+x;return x;}tm=new Date();t=window.prompt("titie?", "");tt=t.split(":");location.href='http://example.com/log/'+tt[0]+"/"+tm.getFullYear()+"/"+z(tm.getMonth()+1)+"/"+z(tm.getDate())+"/"+tt[1]+"?c=e";})()
『カテゴリ:タイトル』をダイアログへ入力すれば新規ページ作成。
せっかくだから、erlangの http://www.erlang.org/white_paper.html を読んでみる。
- Concurrency: 分散処理だわな
- Distribution: ネットワーク上のどこにでもノードを生成できるよ
- Robustness: エラー処理重要
- Soft real-time: リアルタイム処理下のガベージコレクションも考慮してるよ
- Hot code upgrade: 動作中のプログラムを停止させることなく入れ替えできるよ
- Incremental code loading: いつでも新たなコードを読み込みできるよ
- External interfaces: Cの関数に/からメッセージパッシングできるよ
ターゲットとして組み込み系を意識しているのは明白だし、実際ATM交換機で動いているらしい。
CPUの話なのか言語の話なのかわかりにくいけど、
並列プログラミングってそんなに新しいパラダイムではないような。
erlangなんて1980年後半に現われた言語だけど、
すでに並列プログラミングが大きな焦点になってるし。
erlangという言語自体がEricsson(erlangはERicsson LANGuageの略)が電話交換機のために開発したものらしいので、
信号処理ってのはイベントが並行して起こることが多いのだろうなあ、とは思う。
関数型言語だと、参照透過性のおかげで破綻しにくいのだろうけど、
ようやく手続き型言語で問題になったという認識でいいのだろうか。
以下話はずれ続けるけど、
OSに限って言えば、原子性(atomicity)に関する議論はいろいろあるんじゃないかな。
Google:race conditionとか、なんでmktempがいかんのかとか、
たいていセキュリティがらみで出てくるのでちょっと議論がずれてしまうのがアレだ。
まあマルチタスクOSならデータをうっかり壊さないようにするためにも、
議論が必須な事項であると思う。