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

Re: [bep] learning lisp: while



やっと自宅が常時接続になったn高橋です。おかげで今日は寝不足です。

Reiko TAKAHASHI  (高橋玲子)writes:

> } と掛算だから変数名は s よりも p の方がわかりやすいかもしれません。また

>  ……productのpですね。sはsumでしょうか。こちらも全然考えていませんでし
> た。

ここらへんはあくまでも個人の好みの問題です。ただ、一般的な傾向というの
はたしかにあります。ループ変数は大体 i, j, k なんかを使いますが、これ
なんかは最早 Fortran 時代からの伝統ですね。こういう自明なもの以外は、
sum とかproduct (あるいは短く prod) などのように、内容がわかりやすい名
前を付けた方がいいと思います。

> } 細かいことですが、ある数に1をかけても同じですから、(>= n 1) は (> n 1)
> } とするとループを一回減らせます。

>  あっ、そうですよね! 書いていたときは、「もしかして必要ないかもしれな
> いけど、念のため……」とか思っていたのですが、プログラムなんだから、念の
> ためは無駄になってしまいますね。

「念のため」という態度は、プログラムを書くときには非常に大事です。特に
(and (integerp n) (>= n)) のように、引数が目的のタイプに合致しているか
どうかのテストは重要です。

ただ、上の例の「1をかけても値は変わらない」というのは数学的な事実です
から「念のため」の意味がちょっと違いますね。これは省いてもいいと思いま
す。もし >= じゃなくて > でもいいということがわかりにくいようだったら、
その部分にコメントを入れておけばいいと思います。Emacs Lisp の場合、セ
ミコロンから行末までがコメントとなります。計算機はコメント部分を無視し
ますから、そこには何を書いてもかまいません。

>       (while (> n 1) ; no need to be (>= n 1) because x * 1 = x

てな感じでしょうか。コメントは日本語でも大丈夫です。ただし、BEP のよう
に日本語のわからない人も読む可能性のあるプログラムの場合はコメントも英
語で書くべきです。

>  一つ不思議だなと思ったのは、なにかの関数を実行したあと、(私はグローバ
> ル変数でやってしまったので)それぞれの変数を評価すると数字が表示されるの
> ですが、nはエラーになりますよね……? なぜnには数が残らないのでしょう?

defun の行で関数名の次に来る n のことですね?  ここに来るものは自動的に
ローカルになるんです。説明を忘れてました。済みません。

> } はい、これも合っているようです。かなり慣れてきましたね。

>  でも、考えるのにはすごく時間が掛かります(^^;)。さっと書けるようになった
> ら、もっともっとおもしろそうなのですが。

プログラムを書くのはパズルを解くようなもので、考えるのにある程度時間が
かかるくらいの難度のものがやってて一番面白いと思います。でも心配しない
で下さい。世の中にはいくらでも難しいプログラムがありますから、上達しす
ぎてプログラミングに飽きることはありません。:-)

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