Misc Change Log

`OpenBSD で scheme のアプリ開発' みたいなことをやってます。

2004-11-29

一覧の一覧

Wikipedia:一覧の一覧

via: http://dkiroku.com/2004-11-29.html#2004-11-29-1

もちろん 読書記録 さんは、こう続けたかったのだろう。

「一覧の一覧には一覧の一覧自身を含んではいけない」


ああ、Wikipedia:ラッセルのパラドックスだ。

私には高校生の時、この手の変な命題が好きで、有名な GEB に始まって、 パラドックス関係の本はいろいろと読み漁った記憶がおぼろげながらにある。

自己言及文には妙に神秘的なところがあってなにか落着かない気分にさせられる。 自分自身の定義をいじってしまうところに抵抗とちょっとした背徳を感じるのだ。

……

と、ここまでは枕。これから話をプログラミングに向けてみる。 だまされたー、ってのは無しね。

プログラミング言語として、ある意味極北に位置している lisp や scheme では なんでも再帰にしてしまう。 これも一種の自己言及だ。 そしてこれらの関数たちもちょっとしたミスで制御不能になってしまう。

harau さんが、http://d.hatena.ne.jp/hirau/20040605#p1にて、

進捗がつかめないというか、全然駄目なものが少しの変更でいきなりOKになったりする。

とおっしゃっているが、自分もコードを書いていると再帰でうまくいかなくなかったり、 突然うまくいくようになったりするため、 強く共感できる。

考えてみれば、自身の定義を書き換えるのだから、 それ(定義)が正しいか正しくないか、 つまり動くか動かないかのどちらでしかないから、当然といえば当然だ。

一方、ループ(手続き)で書くと、正しい地点まではとりあえず動くので、 こちらの書き方を好む人が多いのもなんとなくうなずける。 実際、デバッグのときは、この方法だと、 とりあえず適当に打ち流して、 後はドミノ倒しを眺めるのと同じように、 ブレイクポイントを設定してトレースする、 といったことが簡単に行なえる。

と、実際の方法論から考察してみたが、再帰にする理由はもちろんそうではない。 再帰による利点はその自己完結性(正しい定義は常に正しい)にあるのではないだろうか。

例えば、ミニマリストのための lisp である scheme は末尾再帰の最適化、静的スコープ等、 再帰による定義を自然に利用できるように支援する機能がふんだんに取り入れられている。 それらの機能は、もちろん自己完結性を追及してのことであろう。

で、唐突に終わることにするが、 こういうわけで結局 lisper は再帰で頭をひねることが習慣になるのだなあ、と思った。 主旨のよくわからない雑感ですまん。

Posted at 09:54 | Permalink | Category | Comments