プログラミング再入門

プログラミングをもう一度ちゃんと勉強する読書ノート

2014-01-01から1年間の記事一覧

SICP 5.2.3 Generating Execution Procedures for Instructions

ノート make-execution-procedureはレジスタマシン言語の命令毎のディスパッチャ。各命令毎に実行する為の手続きを返す手続きが定義されている。 Assign instructions 命令に指定されているレジスタ、式をローカル変数に保存して引数無しの手続きを返す。値…

SICP 5.2.1 The Machine Model

ここからはシミュレータの解説。モデルとしては完全にオブジェクト指向的。 ノート make-machineではメッセージパッシングに応答する手続きを作る。つまりメソッドを持ったオブジェクト。実際にはmake-new-machineがオブジェクトを作り、make-machineではそ…

SICP 5.2 A Register-Machine Simulator

いよいよ本題な感じ。 ノート Exercise 5.7 実装してみないことには何も分からないので、先の節の実装を写経してシムレータを作成してから実行してみる。 Racketではペアはimmutableでset-cdr!は使えないので、instructionのペアのメソッドを以下の様にmpair…

SICP 5.1.3 Subroutines

ノート 昔懐かしいBASICの世界。共通部分を括り出す。 括り出すステップ: それぞれのGCD計算部分の先頭にgcd-1、gcd-2のラベル、GCD計算部分を抜けた所にafter-gcd-1、after-gcd-2のラベルをつけている状態 レジスタはGCDの計算区間でしか使用しないので共…

SICP 5 Computing with Register Machines

ノート プログラムの実行環境についてsubstitution model、environment model、metacircular evaluatorと見て来たが、一番核心の部分はベースのLispシステムに委ねて解説されていない。この章ではプロセッサとそのマシン語に相当するレジスタ・システムをLis…

SICP 4.4.4 Implementing the Query System

4.4章のサンプルを動かしたり、問題を解く為に既に写経してあるけど、中身を読んだ訳ではないので。 ノート 4.4.4.1 The Driver Loop and Instantiation ドライバーループは入力がassert!で始まれば事実かルールを保存、そうでなければクエリとして扱う。qev…

SICP 4.4.2 How the Query System Works

ノート 明らかにquery evaluatorは何らかの探索を行う。 一つの方法は非決定論的プログラミングでambを使った実装。もう一つはストリームを使う実装。(ここではストリームで実装する) query systemは大きく分けて二つの操作からなる:パターンマッチと単一…

SICP 4.4 Logic Programming

Nondeterministic Computingで少し雰囲気を感じつつ、ついに論理プログラミングに到達。 第5章はまた毛色が違う話なので、ここが一つの到達点なのかな。 ノート 数学はdeclarative(宣言的)、コンピュータサイエンスはimperative(命令的)。 高級言語にな…

SICP 4.3.3 Implementing the Amb Evaluator

ここで漸く実装部分。 ノート 普通のschemeの式であれば値が返るか、永久に返って来ないか、エラーで止まる。非決定論的schemeではそれに加えて行き止まりに辿り着いた時に選択ポイントまで戻って評価をやり直すと言う動作が追加される。 バックトラックを実…

SICP 4.3.2 Examples of Nondeterministic Programs

ノート 非決定論的プログラムの例。 組み合わせ生成とフィルタリングする部分をシステム側に隠す事で、プログラムはより抽象化されて問題をストレートに表現出来る。 Logic Puzzles 『ニコリ』の推理パズル。 プリミティブにequal?を足してmemberを定義。abs…

SICP 4.3 Variations on a Scheme -- Nondeterministic Computing

ここは全く予備知識の無い分野。Prologへの布石の様に思える。 ノート 非決定論的コンピューティング? 評価器に「automatic search」を組み込む。遅延評価よりも言語に対して大きな変更となる。非決定論的コンピューティングは『生成してテストする』タイプ…

SICP 4.2.3 Streams as Lazy Lists

ノート 遅延リストとしてのストリーム。3.5.1節で導入したストリームはdelay、cons-streamと言う構文を使ってストリームを作ったため、ストリームには普通のリスト用の手続きは使えず、ストリーム用の手続きを使う必要があった。 遅延評価のシステムではこれ…

SICP 4.2.2 An Interpreter with Lazy Evaluation

ノート プリミティブは正格のまま複合手続きを非正格として評価器を変更する。 評価を遅らせる手続きの引数はサンク(thunk:脚注にその由来。「考えた」)を作る。サンクを評価する事をフォースすると言う。 名前渡し(call-by-name)は引数をそのまま手続…

SICP 4.2 Variations on a Scheme -- Lazy Evaluation

ノート 4.2.1 Normal Order and Applicative Order Wikipediaの訳語によると『正規順序と適用順序』。 正規順序は引数を簡約する前に手続きを適用する。適用順序は手続きを適用する前に引数を簡約する。脚注によるとnormal orderとlazy evaluationと言う言葉…