[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [bep] learning lisp: recursive



n高橋です。再開かな。

Reiko TAKAHASHI  (高橋玲子)writes:

> } 実は一番最初はちゃんと引数の値をチェックするような関数を書いたんですが、
> } そうすると肝腎の「再帰」の説明をする前にそっちを説明する必要が生じてし
> } まい、その結果焦点がぼけてしまいそうだったのであえて簡単な定義にしまし
> } た。

>  その場合のチェックというのは、引数が 1 以上の整数かどうかを確かめる、と
> いうことですね。

そうです。

> 1 以上かどうかのチェックのし方は、なんとなく想像がつく(ほんとうはわかっ
> てない)のですが、整数かどうかのチェックは、どうやってやるんでしょう?

整数かどうかをチェックするには integerp という関数を使います。
数値の大小を比較する関数は < , > , <= , >= なんかがあります。
「AかつB」という条件は (if (and A B) ...) と書きます。

以上がヒントです。後は C-h f を駆使すれば引数が1以上の整数かどうか確か
められますね。

練習問題:
前出の fact に変更をほどこし、引数が1以上の整数でなければ nil を返すよ
うにせよ。

> }   (if 条件式 S式その1 S式その2 S式その3 …)
> } 
> } となります。もし「条件式」を評価した結果が nil 以外になれば、
> } 「S式その1」を評価し、その結果を返します。またもし「条件式」を評価した
> } 結果が nil になれば、「S式その2」「S式その3」…を順番に評価し、一番最
> } 後のS式の結果を if の結果として返します。

>  条件式を評価した結果が nil のほうがたくさんのことができるんですね。
> ……って、へんな言い方かもしれませんが、なんとなく nil よりも t のほうが
> 偉いみたいな気がしていたので意外でした。

そうですね。nil の場合の方が色々できるというのはちょっと変なところです。
多分最初の頃の if は (if 条件式 S式その1 S式その2) としか書けなかった
んじゃないでしょうか。その後アドホックに「S式その3」以降を追加したんで
しょうね。

> } ちょっと面白しいのは、条件式を評価した結果が「nil 以外なら」何でも「真
> } (しん)」とみなす、という点です。t に限らず、1 でも "abc" でも -273.16 
> } でも「真」です。ですから、(if 1 2 3) を評価すると 2 になります。わかり
> } ますか?

>  はい、たぶん、わかったと思います。
> (if 1 2 3) の場合、条件式である 1 を評価した結果は 1。
> 1 は nil ではないので「真」とみなされ、すぐ次のS式である 2 だけが評価され
> て、(if ...)から返ってくる値は 2 になるんですね。

そのとおりです。

>  (if ...)の中で、(if ...)を使うことはできますか?
> ある条件式が nil だったもののうち、別の条件式も nil だったものだけについ
> てなにかの操作をしたい場合とかがありそうな気がするのですが……(DOSのバッ
> チファイルだと、そういうことがときどきあるので(^_^;))。

もちろん if を重ねることもできます。なにしろ (if ...) もS式のひとつで
すから。なお、複雑な条件判定をするときには、if より便利な cond を使う
ことがよくあります。でも cond の紹介は上の練習問題ができた後ですね。

> プログラムを書くときって、実行したときの速さとか、読み易さにも気を配るこ
> とが大切なんですね。ただ動けばいいっていうものではない……。

最初は速度は気にしなくていいと思います。プログラムで一番大事なのは正し
い答を出すことで、次が読み易さだと思って下さい。

> 「主神のオーディンが自分を自分に捧げものとして与える」というのは、オーデ
> ィンがルーン文字を発見するときの話ですよね。

あ、そうだったんですか。知りませんでした。それとも忘れてしまったのかな。

-- 
TAKAHASHI Naoto
ntakahas@...
http://www.m17n.org/ntakahas/