問題解答
問1.6
昨日わからなかった問1.6を考えるところから再開。いろいろ考えたもののわからないので、ギブアップして回答を参考にすることにしました。
述語(good-enough? guess x)が真になっても, new-ifは代替部
(sqrt-iter (impreve guess x) x)
を評価しようとするので, 停止しない.
これを読んで納得。
(new-if good-enough? guess sqrt-iter)
ということになるので、 new-if が評価される前に good-enough? と sqrt-iter 両方が評価されてしまうのか。蓋を開けてみれば何てことはなかったです。
問1.7
計算精度の問題。値が小さいときは許容値が相対的に大きくなりすぎて十分計算がされなくなってしまって、値が大きい時は大きな数値間の差を取ることで有効桁数が落ちて許容値以下にならなくなってしまうため、無限ループになってしまう。
プログラムの改良は一応自前でできたものの、解答と照らし合わせると全く知らない記法がされていて目が点。
これは追々やるだろうし、今のところはこんな感じなのねということで写経しながら流れを掴むだけにとどめておきます。
環境構築
そろそろコードをコンソールで打つ(そして無限ループに入って死ぬw)のも辛いので、今日は Gauche+Meadow で動作確認できるように環境構築をすることにしました。
環境構築は”Meadow + Gauche セットアップメモ“を参考。。。というか、そのまま実行。M-x run-scheme で gosh プロンプトが出るところまですんなり行きました。
もうちょっと詳しい使い方も知りたかったので、ひげぽんさんの”関数型言語の勉強にSICPを読もう – (4) 1章 – 小休止 Schemeの環境整備“も参考にいろいろお試し。
.scm は自動で Sceme モードと紐づいているようなので、ファイルを編集し始めた時点でモードが切り替わります。
操作として覚えないといけないのは
- M-x run-scheme で gauch インタプリタ起動
- ウィンドウを分割して、一方にソースコード、一方で gauche インタプリタを起動した状態で式の末尾で C-x C-eするとその式を実行
さしあたってこの二つくらい。最初勘違いしていたのが、C-x C-e するとファイル全体が評価されるのかと思っていた点。これは式だけなので気をつける必要があります。ファイル全体を評価する方法も知りたかったですがすぐに見つからず。Meadow を使ってるのに Lisp 周りは全然使ってないのがバレバレですね orz→問1.7の回答を見たら、そもそも一つの式にまとめてしまっているのでファイル全体を評価するという必要がないのかも?うーん。。。それだけじゃ足りないような気もするんですが。