プログラミング再入門

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

2012-02-01から1ヶ月間の記事一覧

Scheme手習い 第10章 このすべての値は何だ

この章ではSchemeによるSchemeインタープリタを実装します。実装するインタープリタがサポートするSchemeの仕様はこの本に出て来るSchemeの仕様です。 ノート: entry 連想配列相当。ペアのリストではないのはキーがユニークな集合である必要があるから。new…

Scheme手習い 第9章 ……もう一度、もう一度、もう一度、……(その4)

Yコンビネータについて習います。こんなものどうやって考えつくのか全く不思議ですが、手順を踏むと導き出せる事を実体験出来ます。 ノート: Yコンビネータ defineはここでは要するに関数に名前を付ける機能。『defineがなかったら』関数に名前が付けられな…

Scheme手習い 第9章 ……もう一度、もう一度、もう一度、……(その3)

Collatzの予想、Ackermann関数、チューリングの停止性問題について触れられます。 ノート: Collatzの問題 次の関数はCollatzの予想に登場する関数との事。その前に、one?を以下の様に定義する。 (define one? (lambda (n) (eq? n 1))) Collatzの予想とは、0…

Scheme手習い 第9章 ……もう一度、もう一度、もう一度、……(その2)

明確に書いていないので分かりにくいが、ここでは二分木の操作が紹介されます。 ノート: shift shiftが何をしているのか、言葉の説明を見てもリストの形式で見ても何が起きているのか分かりにくい。挙げられた例を模式図にすると:*1 . / \ . c / \ a bが…

Scheme手習い 第9章 ……もう一度、もう一度、もう一度、……(その1)

まずは宝探しの様な不思議な再帰関数。 ノート: looking lookingの説明は明確には無いが、lookingの挙動を言葉にすると: latの1番目の要素から初めて その要素が数字であれば、次にその数字番目の要素を見る その要素が数字でなければ、aと比較して同じで…

Scheme手習い 第8章 究極のlambda(その2)

ここからは継続の話が出てきます。 ノート: multirember&co なかなかパッと見では挙動がイメージしにくい。再帰関数だが全体の構造としては 再帰部ではcol(その上段から与えられた関数)を呼び出す関数を作って再帰する 基底部では引数で与えられたcolを適…

Scheme手習い 第8章 究極のlambda(その1)

ここでは関数を引数として渡す所謂高階関数を習います。 ノート rember-f 関数を引数に取り、元々eq?で比較していた部分を引数として渡された関数の適用に変更するのみで、全体の定義は元のremberと変わらない。 示された例を適用してみる。 > (let ((test? …

Scheme手習い 第7章 友達と親類(その3)

更に集合演算を習います。 ノート: a-pair 要素が二つのリストであると言う述語。 引数xがアトムであれば偽 xが空であれば偽 xのcdrが空であれば偽 xのcdrのcdrが空であれば真 それ以外は偽 アトム、空リスト、要素が一つしか無いリストを評価してもエラー…

Scheme手習い 第7章 友達と親類(その2)

集合演算の続きです。 ノート: intersect? 「積集合が存在している」と言う述語。 set1が空なら偽 set1の先頭要素がset2に含まれれば真 そうでなければ、set1の残りリストとset2に積終業が存在しているかに依存する。 set1が空の時の関数値が、最初の定義で…

Scheme手習い 第7章 友達と親類(その1)

リストを使った集合演算を習います。 ノート: set? 「(与えられたリストが)集合である(重複が無い)」と言う述語 latが空リストであれば真(確かに重複は無い) latの先頭要素がlatの残りリストに含まれていれば偽 そうでなければlatの残りリストが集合…

Scheme手習い 第6章 影法師

『影法師(Shadow)』が何を意味しているのか正確には分かりません。影法師と言う言葉はこの章の最後に『影法師に注意しなければなりません。』とだけ出てきます。『Scheme修行』まで読んだ感じでは同じ機能を持つ別の実装の事を指している様に思いますが、…

Scheme手習い 第5章 *すごい* 星がいっぱいだ(その2)

木構造のデータの扱いの続き。リストの比較を習います。 ノート: and 最初のandの議論。 > (let ((x 'pizza) (l '(mozzarella pizza))) (and (atom? (car l)) (eq? (car l) x))) #f > (let ((x 'pizza) (l '((mozzarella mushroom) pizza))) (and (atom? (c…

Scheme手習い 第5章 *すごい* 星がいっぱいだ(その1)

この章では要素が一列に並んだリストではなくリストがリストを含む木構造の処理を習います。リストでは再帰の際にcdrを対象としていましたが、ここからはcarも再帰の対象となります。 ノート: rember* 定義を言葉に書き下すと: アトムaとリストlに対して適…

Scheme手習い 第4章 数遊び(その2)

その他の数に関連する関数を習います。 ノート: > Macで使っているDrRacket上では>と>は見間違え様の無い程異なって見えるので、全角の>を使用する。最初の定義で評価する。 > (> 12 133) #f > (> 120 11) #t > (> 3 3) #t > nとmが等しい時に間違う…

Scheme手習い 第4章 数遊び(その1)

この章では数の扱いを習います。元々Scheme(あるいはR5RS)として算術関数は定義されていますが、それを改めて自前で再帰的に定義します。 ノート: 一応、各々の数字がアトムか否かを確認する。 > (atom? 14) #t > (atom? -3) #t > (atom? 3.1415) #t > add…

Scheme手習い 第3章 偉大なるCons(その3)

更にconsを使った関数の続きです。 ノート: subst、subst2 関数substを解釈すると 新しいアトムnew、古いアトムold、リストを要素として含まないリストlatに適用し、「latと同じ要素からなるが最左のoldがnewに入れ替わったリスト」を意味する。 そのリスト…

Scheme手習い 第3章 偉大なるCons(その2)

consを使った関数の続きです。 ノート: firsts 関数firstsを解釈すると 空リストか空ではないリストを含むリストlに適用し、「要素としてのリスト各々の最初の要素だけからなるリスト」を意味する そのリストは: lが空リストの場合は空リストである lの最…