プログラミング再入門

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

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…

SICP 2.3.2 Example: Symbolic Differentiation

数値計算的な微分ではなくて代数的に数式そのものを扱った微分。 Lispにとっては昔から重要なテーマで、シンボルを扱えるプログラミング言語を開発する動機になっていたとの事。まぁ、確かにFORTRANでは難しい。 ノート The differentiation program with ab…

SICP 2.3 Symbolic Data

『シンボル』 All the compound data objects we have used so far were constructed ultimately from numbers. これまで数しか扱って来なかった、と書いてあるが実は数と手続きを扱った気が。C言語から入った人にとってシンボルはちょっと分かりにくい。変…

SICP 2.2.4 Example: A Picture Language

ここでは再びDrRacket+PLaneTのSICPサポートを使います。 http://planet.racket-lang.org/package-source/soegaard/sicp.plt/2/1/planet-docs/sicp-manual/index.html ノート 巷ではそのまま『図形言語』と訳している模様。 The picture language 最初のうち…

SICP 2.2.3 Sequences as Conventional Interfaces

前節ではデータ構造を抽象化する事でデータ構造の詳細に触れる事なくプログラムが作れる事、逆にプログラムに影響を与える事なくデータ構造を変更出来る事を習ったんですね。 タイトルのconventionalの解釈が難しいですが、従来からあるとか慣例的とかだと今…

SICP 2.2.2 Hierarchical Structures

ノート 階層構造。リストの要素としてリストを含む構造。木構造。 データ構造が再帰的な場合それを扱う関数も再帰的に定義するのが自然。 Exercise 2.24 (list 1 (list 2 (list 3 4))) を図2.6の様な木構造の図にすると。(微妙に節の部分の表現が違うけど)…

SICP 2.2 Hierarchical Data and the Closure Property

漸く『データ構造』っぽい話。 ノート 階層データと閉包特性。 よくLISPの説明で見かけるcons cellの構造の図はbox-and-pointer notationと呼ぶらしい。 cell自体はポインタの組。ポインタの先は別のcons cellかbox。boxの中身は既出で言うと整数、小数、分…

SICP 2.1.4 Extended Exercise: Interval Arithmetic

ノート 追加演習?幅を持った値の算術。Alyssa P. Hackerちゃんが誤差範囲(?)を持った数値の演算を支援するシステムを作成していると言う。 例えば並列に繋いだ二つの抵抗器の合成の抵抗値の計算。抵抗器は抵抗値に対して一定の誤差範囲が定義されている…