カテゴリー: SICP

SICP, 未分類

SICP を読んでみる #4 第一章 pp.14-20

問題解答

問1.8

これは手を動かすだけ。 improve を式のままに置き換えて終了です。

ちなみに確認用に pow も定義してみました。

(define (pow x y)
	(if (= 1 y)
			x
			(* x (pow x (- y 1)))))

本文

1.1.8 ブラックボックス抽象としての手続き
変数のスコープの話。内部定義とブロック構造で、問1.6の回答で出てきた記法の解説。このようなやり方を静的有効範囲(lexical scoping)という。

1.2 手続きとその生成するプロセス
線形再帰プロセスと線形反復プロセス。最初、二つの例がどう違うのかよくわからなかったものの、if は条件を評価した結果を評価してるだけだから、スタックに積まれるというわけではないという解釈でいいんでしょうかね?普通のプログラミング言語だとどちらも再帰になりそうな気がするんだけど。

P.20 まで本文を読み進めるとまさにそのあたりのことが記述されている。再帰的プロセスと再帰的手続きの違い。

SICP

SICP を読んでみる #3 第一章 p.14 (オマケで環境構築)

問題解答

問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の回答を見たら、そもそも一つの式にまとめてしまっているのでファイル全体を評価するという必要がないのかも?うーん。。。それだけじゃ足りないような気もするんですが。

SICP

SICP を読んでみる #2 第一章 pp.12-14

何だかんだ作業していたら夜中になってしまって SICP を読む時間がほとんど取れず。
作業の進捗も大事だけど、うまいこと切り替えないと時間の捻出ができなくなってしまうので、今後対策を考えていかないと。

今回は Newton 法の解説を読みつつコードを写経して動作確認と、問1.6に着手。

問1.6は実際に動かしてプログラムが返ってこなくなることは確認できたものの、なぜそうなるか説明ができないところでタイムアウト。明日また考える。

SICP

SICP を読んでみる #1 第一章 pp.1-12

今日は新幹線の中で読んだ内容のおさらいとして 1-12P を、メモをとりながら読み込み。内容はプログラムの基礎や Lisp の文法、Lisp インタプリタ内での式の評価順序について。

演習問題を確かめようと実行すると無限ループになって帰ってこなくなるような罠が潜んでたり、さっそく Lisp の面白い書き方例が出てきたり。

(define (a-plus-abs-b a b)
((if (> b 0) + -) a b))

なんてのは、実行して理解したら”おおっ!!”という感じがする。

SICP

SICPを読み始めてみた

ずっと昔から読もう読もうと思いつつほったらかしにしていた SICP を今年は読んでみることにしてみました。
#正月、帰省帰りの新幹線内でたまたま読み始めたってのがきっかけなんですが

1.1.6 まで読んだ感じだと、まあ一人で読むこともできそうだなーって感触はあるものの、多分一人で読んだら体力切れで途中で挫折するなーって感じもしているのでちょっと計画を立てつつ完走できるようにしたいなとおもっています。

計算機プログラムの構造と解釈[第2版]は書籍も出ていますが、Web でも公開されています。Web 版は書籍で載っていない問題の解答もあるのでとても助かります。

そんなこんなで動作確認をするために Scheme を実行するための環境構築をしなければいけないんですが、Scheme って言っても結構いろいろあるものなんですね。どれにするかなーとググっていたら正にこの正月から SICP を読み始めたという同志(こっちが勝手に言ってるだけw)を発見。

SICP を読むために Emacs で Scheme 環境を構築

環境構築の内容がものすごく詳細に書かれていて参考になりそうなのでこちらを参考にさせていただきつつ、処理系も Gauche を使うことに。 Gauche は SICP で使われているものとは細かいところで違いがあるようなので、 “SICPを読むためにやっておくと便利かもしれないこと” あたりに目を通しておくといいかも?

ひとまずコードを実行して動作確認をしたいだけなら Gauche を起動すればできるので今日のところはこれで確認するとして、ボチボチ Emacs の連携とかの環境を整えつつ本を読み進めていこうかとおもっています。