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

[jfriends:00113] 第 1 回 SICP 読書会議事録



------------------------------------------------------------------------
■■■■ 超大型514名様プレゼント実施中! ■■■■■■■■■■■■■■
■■┏━━━━━━━━━━━━━┓☆☆あなた好みの情報を厳選でお届け☆☆
■■┃ どーんと現金100万円!! ┃   ━━ NTT NaviSpace Presents ━━
■■┗━━━━━━━━━━━━━┛今なら2人に1人が当るデパート商品券♪
■■■■◎もちろん無料 http://myd.nttnavi.co.jp/camp33.html ■■■■■■
------------------------------------------------------------------------


やました です。

第1回 SICP 読書会議事録です。
あまりちゃんとメモをとっていなかったので(おいおい^^;)で
抜けがtakusanある鴨。

  -- ここから -------------------------------------------------------

第1回 「計算機プログラムの構造と解釈」読書会記録

出席者(敬称略、着席位置順):

えんどうやすゆき、橋本 孝博、
横山 晴庸、
木下 信、         野中 愛、
藤沢 淳、        伊部 恵理子、
Nobuo Yamashita、 阿部 智彦、
寺本 諭司、       高橋 徹、

読み手:えんどう
書記:Yamashita

献辞
	<<なかなか感動的である。>>
序文
第二版への前文
第一版への前文
	誤殖発見
		第4パラグラフ最後の行
		「...設計のある面をを強調し、...」
              →「...設計のある面を強調し、...」
謝辞
	読むの省略

1. 手続きによる抽象の構築

Lispによるプログラム

1.1 プログラムの要素

1.1.1 式

	「式(expression)を入力すると解釈系は応答してその式を評価した
	(evaluating)結果を表示する。」

	「どのような複雑な式に対しても解釈系は常に同じ基本動作を繰り返
	す:端末から式を読み込み、その式を評価し、結果を印字する。この
	ような動作のことを、解釈系は 読込み-評価-印字ループ
	(read-eval-print loop)を回るということがある。」

1.1.2 名前と環境

	<< (define size 2)を評価したときの解釈系の応答は実装依存である。 
	たとえば、6.001用のMIT Scheme 7.5aでは ;Value: "size --> 2" と
	表示され、MIT Scheme 7.5.x のデフォルトでは ;Value: size と表
	示される。>>

	「値と記号を対応づけ、後にそれが取り出せるためには、解釈系は名
	前とオブジェクトの対を見失わないための、何か記憶を保持している
	ことに他ならないことは明らかである。この記憶を環境
	(environment)(より正確には、後になって計算は多くの異る環境に関
	るということがわかる故に大域環境(global environment))という。

1.1.3 組合せの評価

	「・組合せを評価するには次のことを行う:
	1. 組合せの部分式を評価する。
	2. 最左部分式の値である手続き(演算子)を、残りの部分式の値であ
	る引数(被演算子)に作用させる。」

	「すなわち、評価の規則は、本質的に再帰的(recursive)である;つ
	まり、手順の一部に規則自身を呼び起す必要がある。」

	「このような一般評価規則の例外を特殊形式(special form)という。」

1.1.4 手続き作用の置換えモデル

	<<第一版の翻訳では、substitution に「代入」の訳語をあてていた。
	後の章での assignment にも「代入」の訳語をあてていたため、混乱
	した経験がある。>>

作用的順序と正規順序

	<<C言語の引数付マクロの使用は、正規順序の評価の使用であるとい
	える。>>

1.1.6 条件式と述語
	cond  場合分けの特殊形式
	(cond (<p1> <e1>)
	      (<p2> <e2>)
	      ...
	      (<pn> <en>))
        if    場合分けが2つの条件式である特殊形式
	(if <predicate> <consequent> <alternative>)
	and、or は特殊形式
	not は通常の手続き

問題1.1〜1.4 省略

問題1.5 (一寸したクイズでしたね)
	(問題の解答については後でまとめます。)

1.1.7 例:Newton 法による平方根
	「関数と手続きの対照は、もののあり様の記述と、ことのなし方の記
	述の違いの反映である。あるいは、よくいわれるように、平叙文的知
	識と命令文的知識の違いである。われわれは数学では通常平叙文的
	(何である)記述に関心をもつが、一方、計算機科学では命令文的(ど
	うする)記述に関心をもつ。」

	<< Schemeでは、この違いをはっきりと認識させるためか、C言語でい
	う「関数」をすべて、「手続き」と呼んでいるようである。>>

問題1.6 (これもちょっとしたクイズでしたね。)

1.1.8 ブラックボックス抽象としての手続き

	「分割戦略は単にプログラムを部分に分けることよりも重要である。
	大きなプログラムがあれば、最初の10行、次の10行、次の10行のよう
	に分けることは出来る。そうではなく、各手続きは、他の手続きを定
	義する時、その部品として使え、まとまった仕事ができることが重要
	だ。たとえば、square を使って good-enought? 手続きを定義する時、
	われわれは square 手続きをブラックボックスとして見ることが出来
	る。その時、その手続きがどう結果を計算するかには関心を持たない。
	関心があるのはそれが二乗を計算するという事実だけである。二乗を
	計算する方法は隠しておき、後で考える。実際 good-enough? 手続き
	に関する限り、square は手続きではなく、手続きの抽象、いわゆる
	手続き抽象(procedural abstraction)である。このの抽象レベルでは、
	二乗を計算する手続きならどれでも同じく有用である。」

	<<OOPの教科書でも「情報隠蔽」のところで同じような話しがでてく
	る。>>

局所名
	「手続きの仮パラメタには、手続き定義の中で、仮パラメタがどんな
	名前を持っていても構わないという、特別な役目がある。そういう名
	前を束縛変数(bound variable)といい、手続き定義は仮パラメタを束
	縛する(bind)という。定義の中で束縛変数名を統一的につけ替えても、
	手続き定義の意味は変らない。変数が束縛されていなければ、自由で
	ある(free)という。名前が束縛されている式の範囲を有効範囲
	(scope)という。手続き定義の中では、その手続きの仮パラメタとし
	て宣言された束縛変数の有効範囲は、その手続き本体である。」

内部定義とブロック構造

	「ブロック構造はプログラム言語Algol 60で始り、先進的プログラム
	言語の殆んどに見られ、巨大プログラムの構築作業を援助する重要な
	道具になっている。」

	<<静的有効範囲(lexical scoping)ではない動的有効範囲(dynamic
	scoping) ってなに?>>
	<<伝統的なLispは動的有効範囲のものが多い。>>
	<<プログラマにとっては静的有効範囲の方が分りやすい。処理系の実
	装にとっては動的有効範囲が自然。>>

	(動的有効範囲について調べてみました。

	Emacs LispはDynamic Scopingである。たとえば、

		                          ;; Scheme の書き方では
		(defun binder (x)         ;; (define (binder x) (foo 5))      
                  (foo 5))                
		(defun user ()            ;; (define (user) (list x))
                  (list x))
	
        静的有効範囲の言語(Scheme)では、binder の中の x に user でアク
	セスすることはできない。ところが Emacs Lisp だと

		(defun foo (lose)
	          (user))

	と定義して binder を呼出すと、binder で作成された束縛は、user
	で可視になり、

		(defun foo (x)
		  (user))

	と定義して、binder を呼出すと、binder で作成された束縛は、user
	で不可視になる。-- GNU Emacs Lisp リファレンスマニュアル参照

	Pascal の例

	program dynamic(input,output);
	   var r : real;

	   procedure show;
              begin write( r : 5:3 ) end;
	   procedure small;
              var r : real;
              begin r := 0.125; show end;
           
           begin
             r := 0.25;
             show; small; writeln;
           end.
	
	このプログラムの出力は
	   0.250 0.250
	である。これが動的有効範囲の場合では
           0.250 0.125
	となる。  -- 「コンパイラ」Aho,Sethi and Ullman )

        -------------------------------------------------ここまで----


次回はp.17「1.2 手続きとその生成するプロセス」から


;; 今回の範囲の問題の解答をYamashitaが作成したものが
;; http://www.nyd.inzai.chiba.jp/nobsun/prog/fp/scheme/sicp-j/sicp.1.1.html
;; にあります。参考にどうぞ。(解答については無保証です。うそがある鴨)