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

Re: [bep] weather



n高橋です。すでに井上さんがほとんど答えてくれたようですね。話を簡単に
するため、以下では Lisp の専門用語は使わないで、一般的なプログラミング
の用語で説明します。

Reiko TAKAHASHI  (高橋玲子)writes:

>  Lispの解説をありがとうございます。
> ひとつ、わかりきったことだったのかもしれないけれど、とても大切なことに気
> づきました。

> Lispって、DOSのバッチファイルみたいに上(の左側)から順にコマンドを処理し
> ていくのではなくて、ちょうど算数の数式のように、括弧を見ながら、いちばん
> 深い(?)ところから順に処理していく……んですね??! だからこそ、「静かな
> 湖畔」状態になってしまうんだということに、今になって気づきました。

> 私が「順番が不思議」とこだわっていたのも、括弧の役割が全然解っていなかっ
> たからなんです。
> もし、同じ深さの括弧がいくつも出てくる場合には、上(の左)から順に処理さ
> れていくと考えていいですか?

井上さんも書いていましたが、処理は上の左側から進みます。と言うか、進め
ようとします。で、進むために別の関数が必要になったら、とりあえず今まで
やったことを置いておいて、先にその必要となった関数を実行します。結果が
得られたら、その結果を利用して先ほど中断した関数の処理を再開します。

(+ 1 (* 2 3)) の例だとこうなります。

1. 左かっこに続いて+があるので、これから足し算を実行するということがわ
   かる。

2. 次に1があるので、足すべきものの一つめが1だとわかる。

3. 次に (* 2 3) があるので、1に足すべきものは (* 2 3) の結果だというこ
   とがわかる。

4. 「1に何かを足」す、という部分はひとまず置いておいて、先に (* 2 3)
   を実行する。

5. (* 2 3) を実行すると6という値が得られる。

6. これで足すべきものは6だということがわかるので、元に戻って1と6を足し、
   答の7を結果として返す。

というわけです。

一見、一番深いところからやっているのと同じように思えますが、そうでない
例もあります。setq のように変数に値を代入したりすると順番が問題になっ
てくることがあります。ちょっとややこしくなるので例は省略します。

> } これに and と関係代名詞節の範囲がはっきりするよう括弧を付けると
> } 
> } INSERT the result of
> }   (
> }      the FORMAT function whose arguments are
> }        "お天気: %s"
> }        and 
> }        (the result of the WEATHER-FROM-HTTP function
> }          whose argument is "東京地方".)
> }   )

>  元のLispでは、"the result of the WEATHER-FROM-HTTP function ..."の部分
> をいちばん初めにしなければならないので、そこに括弧が付いていると考えてい
> いですか?

> 			(insert
> 			 (format "お天気: %s"
> 				 (weather-from-http "東京地方")))

上でも書いたように、実行は上の左からやろうとします。

1. (insert -- よしよし、挿入命令だな。次に来るものを挿入してやろう。
2. (format -- なんだ、別の関数か。それじゃあまずこいつを実行しなきゃ。
3. "お天気: %s" -- 「お天気: 」の後に、この次のものを代入するんだな。
4. (weather-from-http -- げ、また関数かよ。3の代入は一旦中断だ。
5. "東京地方" -- よし、これを引数として weather-from-http を実行だ。
6. なになに、実行結果は「雨でおじゃる」か。ではこれが4の結果だ。
7. つーことは3の %s には "雨でおじゃる" を入れればいいってことだ。
8. となると2の format の結果は "お天気: 雨でおじゃる" だな。
9. やっと1に戻ってきた。つまり "お天気: 雨でおじゃる" を挿入するわけね。

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