[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [bep] learning lisp: recursive
- To: bep@argv.org
- Subject: Re: [bep] learning lisp: recursive
- From: Reiko TAKAHASHI <HFC03614@nifty.ne.jp> (高橋玲子)
- Date: Sun, 17 Jun 2001 20:39:52 +0900
- Delivered-To: mailing list bep@argv.org
- Mailing-List: contact bep-help@argv.org; run by ezmlm
r高橋です。
Reply TAKAHASHI Naoto <ntakahas@...>'s message:
} 残念ながら数字以外にもシンボルとして使えないものはあります。括弧とかセ
} ミコロンなんかがそうです。まあ特殊な技を使えばそれらも大丈夫なんですが、
きゃっ、括弧がふつうに使えてしまったらたいへんですよね!
} 渡された場合に止まらなくなります。また、1.5 などの小数が与えられた場合
} も止まりませんね。最初に「小さめの正の整数を引数に与えて下さい」と書い
あっ、ほんと、小数もまずいですね。小数を入れてみることは考えつかなかっ
たです。
} 実は一番最初はちゃんと引数の値をチェックするような関数を書いたんですが、
} そうすると肝腎の「再帰」の説明をする前にそっちを説明する必要が生じてし
} まい、その結果焦点がぼけてしまいそうだったのであえて簡単な定義にしまし
} た。
その場合のチェックというのは、引数が 1 以上の整数かどうかを確かめる、と
いうことですね。
1 以上かどうかのチェックのし方は、なんとなく想像がつく(ほんとうはわかっ
てない)のですが、整数かどうかのチェックは、どうやってやるんでしょう?
} 再帰的な定義をするときは、このように無限ループに落ち入らないよう常に気
} を付けなければいけません。それにしてもよく気が付きましたね。プログラマ
} の素質があるんじゃなでしょうか。
……実は私は数学が激しく苦手なので、素質は今一っぽいのですが、コンピュ
ータでこんなことができたらいいなと思っていることが、工夫してプログラムを
書けばできちゃうかもしれない、というのにはすごく惹かれています。すぐに挫
折するかもしれないけれど、とても丁寧に説明していただいているおかげで、今
はまだすごくおもしろいです。
} (if 条件式 S式その1 S式その2 S式その3 …)
}
} となります。もし「条件式」を評価した結果が nil 以外になれば、
} 「S式その1」を評価し、その結果を返します。またもし「条件式」を評価した
} 結果が nil になれば、「S式その2」「S式その3」…を順番に評価し、一番最
} 後のS式の結果を if の結果として返します。
条件式を評価した結果が nil のほうがたくさんのことができるんですね。
……って、へんな言い方かもしれませんが、なんとなく nil よりも t のほうが
偉いみたいな気がしていたので意外でした。
} ちょっと面白しいのは、条件式を評価した結果が「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のバッ
チファイルだと、そういうことがときどきあるので(^_^;))。
} = は数値同士しか比較できません。ですから (= 'a 'a) はエラーになります。
} equal は何でも比較できます。(equal 'a 'a) は t になりますし、
} (equal 'a 1) は nil になります。じゃあ equal だけあればいいじゃないか
} と思われるかもしれませんが、= にもいいところはあります。
}
} まず第一には、数値の比較に特化されている分だけ実行が速いということです。
} また、引数に数値以外が来たときにエラーになるということは、自分で書いた
} プログラムの間違い探し(デバッグ)に役立ちます。さらに他人が書いたプログ
} ラムを読む場合でも、ああここの変数はどっちも数値なんだな、ということが
} はっきりします。
わかりました。
プログラムを書くときって、実行したときの速さとか、読み易さにも気を配るこ
とが大切なんですね。ただ動けばいいっていうものではない……。
} 北欧神話(エッダ)には、主神のオーディンが自分を自分に捧げものとして与え
} るという場面が出てきます。私は高校生のときにこれを読んで、「おお、リカー
} シブ」と思ったもんです。かわいげのない高校生ですね。(笑)
きゃあっ、高校生のときには、すでにプログラマさんだったんですね!!
私は、今回リカーシブを教えていただいて、幼稚園で読んでもらったおはなしの
一部を思い出しました。
物語の筋は全然覚えていないのですが、ウサギとリスが見ている絵本に、ウサギ
とリスが絵本を見ている絵が描いてあって、その絵の中の絵本にもウサギとリス
が絵本を見ている絵が描いてあって、その絵本の中にも……っていうのだったん
です。どこまで続くんだろうって、すごく不思議でたまらなかったのを思い出し
ました。いったいどんなおはなしだったんでしょうね(^.^)。
『エッダ』ですが、白状すると、私はこれまで北欧神話を全く知りませんでし
た。で、先週は、逃避欲求がおそろしく強かったこともあって(^^;;;)、ウェブ上
でだけだけれど、いろいろ調べて遊んでしまいました。タロットのページとか、
ゲームのページとか、ちょっと不思議なのも多かったけれど、すごくおもしろく
て、思いがけない得をしちゃった気分です。
「主神のオーディンが自分を自分に捧げものとして与える」というのは、オーデ
ィンがルーン文字を発見するときの話ですよね。
お話に出てくるいろいろなアイテム(?)や、「世界樹」というものの存在、世界が
できたときの様子等、読んでいてわくわくしました。
私は、荒々しい雷神のはずなのに美しい女神に女装してハンマーを取り返しに行
く羽目になってしまったトールが、ちょっと好きになりました。
今度機会があったら、『エッダ』そのものをちゃんと読んでみようと思います。
ちなみに、私が(ちらりとでも)読んだページは
http://www5.ocn.ne.jp/~kakita/north1.html
http://www.asahi-net.or.jp/~qi3m-oonk/tosyokan/fantasy/w-hokuousinwa.htm
http://w2.amn.ne.jp/~vanadis/norse/main.html
http://www.pandaemonium.net/menu/myth05.html
http://www4.justnet.ne.jp/~yuriusu/hokuou/hokuou_menu.html
です。Web上に、抜き書きではない日本語訳は見つけられなかったのですが、
http://www.angelfire.com/on/Wodensharrow/vafthrudhnismal.html
のサイトには、Eddaの英訳(らしきもの)がいろいろありました。
# 逃避の友がいっぱいできてうれしいです(^_^)。
**-***-***-***-***-***-***-***-***-***-***-***-**
Reiko TAKAHASHI (高橋玲子)
E-mail: HFC03614@...
ICQ UIN: 85924121 (Twinkle)
**-***-***-***-***-***-***-***-***-***-***-***-**