リスト遊び - 深遠なる再帰の世界

リスト遊び―Emacsで学ぶLispの世界リスト遊び―Emacsで学ぶLispの世界
山本 和彦

アスキー 2000-05
売り上げランキング : 74690
おすすめ平均

Amazonで詳しく見る
by G-Tools

少し本の山が小さくなってきました。
下手したら2年くらい積読状態だったものがあるんでいつ買ったんだっけっていうのが多いです。
早くきれいにしたいっ。

Lispという言語は古くからあるんですがあまりポピュラーではありません。
かっこばかりのコードが暗号のように見えるので敬遠されるのかもしれません。
しかしこれを知らないプログラマーは無駄な仕事をやらなければいけないはめになる可能性が高いです。

Lispでは再帰というテクニックを使ってとてもスマートにコーディングすることができます。
再帰とは自分自身を関数内で呼ぶテクニックです。
例えば階乗(1*2*3*...という掛け算)は次のようにコーディングできます。


defun factorial (n)
(cond
((zerop n) 1)
(t (* n (factorial(1- n))))))

defunは関数定義でここではnを引数に持つfactorialという関数の定義をしています。
condはCでいうswitchで条件分岐の意味です。
zeropは0かどうかをチェックする関数でこのコードではnが0だと1を返すとなっています。
そしてnが0以外だったらその下のコードが実行されます。
ポイントはfactorial(1- n)というところでn-1以下の計算をまかせてしまっています。
ここがみそで手抜きみたいに見えますけどこれでちゃんと値がでてくるんですよね。

 これができるのもLispのデータの基本単位がリスト構造になっているからです。
リスト構造とは自分が持つ値と次のリスト要素へのポインターを持つ構造をいいます。
これによりじゅずつなぎのようなデータ構造になるので処理するのに都合がいいわけです。

いまやEmacsエディターにもLispインタープリターが実装されていますしフリーのCommon Lispや方言のSchemeもフリーで色々でているので簡単に試すことができます。
(昔はCommon Lispが高かったな。)
Lispもいまさらって感じかもしれませんが、再帰が役に立つシステムで使ってみるのもいいかもしれませんね。