プログラミング再入門

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

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

SICP 4.1.7 Separating Syntactic Analysis from Execution

ノート 我々の評価器は評価しながら実行し、評価した結果は残っていないので再帰であっても同じ式であっても何度でも評価するので非効率。 analyzeの結果として実行部としてベースのLispの手続きを返してenvの元で実行する。analyze-sequenceはちょっと複雑…

SICP 4.1.6 Internal Definitions

ノート 内部定義。 テキストの評価器はdefineが出て来る度にその定義を環境に保存するが、それとは違う方法を取る事も出来る。 テキストの例のodd?のスコープは手続きf全体であって、fのスコープのうちodd?が定義されて以降ではない。と言う事はeven?とodd?…

SICP 4.1.5 Data as Programs

ノート プログラムを電子回路の様に理解する事も可能だし、何だか分からないけど凄い機械と理解しても良いが、評価器は評価器が扱うデータ構造と評価されるプログラムを繋ぐものと捉えられる。 プログラミング言語のユーザーにプログラム内でその言語を評価…

SICP 4.1.4 Running the Evaluator as a Program

漸く核心の手続き評価部分。 ノート 評価器はプログラムを最終的にプリミティブによるプログラムまで簡約するので、最終的にはプリミティブをベースのLisp上で実行する事になる。最初の環境を用意する。そこには言語として最初から定義されている値やプリミ…

SICP 4.1.3 Evaluator Data Structures

ノート 前節ではスタブで誤摩化していた部分の実装の続き。定義された手続き、変数、環境など。 Testing of predicates 内部で評価する際に使うtrue?とfalse?の定義。 Representing procedures 手続きを実行する部分は4.1.4まで先送り。 ここでは手続きの内…

SICP 4.1.2 Representing Expressions

ノート 式の表現。 式を解釈して要素を取り出す部分と、要素分解された式を評価する部分とは分離する事が出来る。 tagged-list?は特定のシンボルから始まるリストかどうかをチェックする。 definition-variableはexpの第2要素がシンボルであれば基本構文な…

SICP 4 Metalinguistic Abstraction

どうも普通の言語(と言うかLisp)では実現されていない、更にそこからはみ出たアイデアについて。 Lispで書くLispインタープリタは『Scheme手習い』で経験済み。 ノート Metalinguistic abstraction -- establishing new languages -- 超言語抽象=新しい言…

SICP 3.5.5 Modularity of Functional Programs and Modularity of Objects

ノート 関数型プログラミングのモジュラリティとオブジェクトのモジュラリティ。 モジュラリティはモジュール性。モジュール性は部品化度合いかな。乱数列をストリームにすると、チェザロの実験(単に乱数列の隣り合う二つが互いに素か否かを判定する)とモ…

SICP 3.5.4 Streams and Delayed Evaluation

ノート ストリームと遅延評価。 The interpreter's ability to deal with such an implicit definition depends on the delay that is incorporated into cons-stream. implicitだと行っているのはintとしては明示的に再帰的な定義になっているが、評価され…

SICP 3.5.3 Exploiting the Stream Paradigm

ノート 「exploit」は英和辞典には「不当利用」的な意味が乗っているが、英英辞典では「最大限に利用する」と言う意味。 Moreover, they avoid some of the theoretical tangles that accompany the introduction of assignment into a programming language…

SICP 3.5.2 Infinite Streams

ノート 必要になった部分の値をその時に生成する手法で無限リストが作れる。 以下の実装で #lang racket (define-syntax cons-stream (syntax-rules () ((cons-stream a b) (cons a (memo-proc (lambda () b)))))) (define stream-null? null?) (define the-…

SICP 3.5 Streams

SICPは計算機科学の最初に習うコースとの事ですが、最初から遅延評価を習う事に驚き。 ノート 状態をモデリングするもう一つの方法としてのストリーム。ストリームの方が複雑さをやや緩和出来る。 時々刻々と変化する実世界の状態を、状態変数とその値を変化…

SICP 3.4.2 Mechanisms for Controlling Concurrency

ノート 3つのステップを2つのプロセスが行うだけで、各ステップの順番は20通り。 その数は全部で6つのステップがあるので、その順列が6!通り。但し、(a, b, c)、(x, y, z)それぞれの中では順番は入れ替わらない。6!通りの中には(x, y, z)の位置と順序は…

SICP 3.4 Concurrency: Time Is of the Essence

ノート 代入を導入する事でプログラムにある種の時間概念が生まれた。これによって色々と面倒な事を考慮しなければならなくなったがより現実に近いモデルが作れる。これを更に拡張して(現実に近づけて)複数の事が同時に起きる事をモデル化する。 3.4.1 The…

SICP 3.3.5 Propagation of Constraints

論理回路モデルの応用で制約プログラミング的なモデルを作ります。 ノート 論理回路モデルの様にゲートとしての代わりに演算子と定数、入力・出力やゲート間を繋ぐワイヤを定義して計算回路を作る。回路の外に出ているワイヤはどれも入力としても出力として…

SICP 3.3.4 A Simulator for Digital Circuits

漸く有名なデジタル回路シミュレーション ノート イベントドリブンなシミュレーションとの事。入力信号の変化に対して一定のディレイの後アウトプットが変化する。 wireを定義。gateの定義は接続されるwireを引数に取る。half-adder、full-adderを定義するに…

SICP 3.3.3 Representing Tables

キュー(待ち行列)に引き続き今度はテーブル(表)。2章で使ったテーブルがここで漸く登場。 ノート 1次元のテーブルとはキーでインデックス化された列の事。recordと呼んでいるセルのcarがキーを、cdrが値を指している。そのrecordのリスト(あるいはそ…

SICP 3.3.2 Representing Queues

ノート 待ち行列の表現 ここでは後ろから詰めて前から出す方式。と言うのも後で分かるが最後の要素を削除するのは意外と厄介なので、自然と削除は先頭からとなる。一番後ろを見つけるのに手前から一つずつ追っていたのでは要素数が大きくなった時に非効率な…

SICP 3.3 Modeling with Mutable Data

ノート 第2章で勉強した複合データはコンストラクタとセレクタを定義した。代入がが出来れば状態が変化する複合データも作れる。mutatorの導入。mutableと言う言葉は良く目にするが、オブジェクトの状態を変化させるmutatorと言う言葉はこれまで余り目にす…

SICP 3.2.3 Frames as the Repository of Local State

局所状態の保存場所としてのフレーム。 ノート 手続きとはlambdaの本体とlambdaが評価されたときのフレームへの参照をもったペア。 その手続きが呼び出された時には引数の値に拘束した仮引数を保存したフレームを作り、その外部環境としてその手続きが参照し…

SICP 3.2 The Environment Model of Evaluation

Evaluationは評価だが要はプログラムの実行の事。なのでプログラム実行の為の環境モデル。実行と言っている時点で命令型な考え方だけど。置換モデルはあくまでそう解釈出来ると言う意味で概念的なので具体的にコンピュータがどう動作するのかをイメージしよ…

SICP 3.1.3 The Costs of Introducing Assignment

面白い事に代入を導入すると同時に代入が存在しない関数プログラミングの説明がされる。むしろ代入を導入する事で代入の存在しない関数プログラミングを説明しているのかも知れない。 ノート 代入を導入する事による代償。 代入が存在すると置換モデル(subs…

SICP 3.1.2 The Benefits of Introducing Assignment

章の最初は軽くて快調、快調。と思いきや乱数の「質」は意外と重要である事を再確認するはめに。 ノート 代入を導入する事によるメリット。 As we shall see, introducing assignment into our programming language leads us into a thicket of difficult c…

SICP 3 Modularity, Objects, and State

漸く第3章に到達。既にかなりお腹いっぱいな感じですが、これから更に面白くなって行く事に期待。 ノート モジュラリティは部品(モジュール)としての独立性とかその度合い。物理系をモデル化したシステムを構築するひとつの有効な方法は、モデル化した構…

SICP 2.5.3 Example: Symbolic Algebra

第2章も漸く大詰め。 ノート 再び登場、代数式による例。Symbolic Algebraはシンボル代数?記号代数? Arithmetic on polynomials 多項式の計算。 ここでは変数がひとつの一元多項式に限定する。多項式は項の和で構成されて、項は係数(定数)、変数の冪乗…

SICP 2.5.2 Combining Data of Different Types

と言う訳で、ここまで避けて通って来た異なる型同士の演算について。 基本的には総称関数の話だが、オブジェクト指向のメソッド検索にも通ずる話。 ノート complexにscheme-numberを足す例。 (define (install-complex-package) …中略 (define (add-complex-…

SICP 2.5 Systems with Generic Operations

ノート Now we will see how to use this same idea not only to define operations that are generic over different representations but also to define operations that are generic over different kinds of arguments. 単にそれぞれのデータ型用の手続…

SICP 2.4 Multiple Representations for Abstract Data

data-directed programmingと言う言葉は聞いた事はなかったけど、状態マシンの実装の様に取るべきアクションが表になっていて、これに応じて動作するプログラムの話かと思いきや、実行時型情報的な話から総称関数、message passingに繋がり、いつのまにかオ…

SICP 2.3.4 Example: Huffman Encoding Trees

木を使った実用例としてデータ圧縮で使われるハフマン符合の話。 ノート ハフマン符号化に使う木は、葉に各文字とその発生頻度、節にはその下に含まれる全ての文字と発生頻度の合計を持つ。ここでは枝を左に辿ると0、右に辿ると1で符号化する。復号する時…

SICP 2.3.3 Example: Representing Sets

『Scheme手習い』だったか『Scheme修行』だったかで出て来たリストを使った集合演算の話。 ノート union-set、intersection-set、element-of-set?、adjoin-setを実装出来るデータ構造を作る。 Sets as unordered lists 順不同リスト(?)で表現した集合。 e…