プログラミング再入門

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

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

SICP 1.2 Procedures and the Processes They Generate

前回のアップロードが5月27日なので約3ヶ月ぶりとなります。この間本業が大変忙しかったのですが漸く帰って来ました。暫くペースは上げられませんが地道に頑張ります。 ノート 手続きとそれが生成するプロセス。 Our situation is analogous to that of some…

SICP 1.1.8 Procedures as Black-Box Abstractions

ノート ブラックボックスとしての手続き。 再帰については1.2で詳しく。問題を小さな問題に分割する。大きな問題を小さな問題に分解すると言っても長いプログラムを10行毎に分割する訳ではない。意味のある一塊毎に分解し、その実装を気にしなくても使える様…

SICP 1.1.7 Example: Square Roots by Newton's Method

ニュートン法による開平。あるいは開根。 Procedures must be effective. effectiveの訳は難しいが、実行可能とか具体的に答えを求める事が出来るとか言った感じか。 『yは2乗するとrになる数。』と明言しても、具体的にyは求められない。 The contrast bet…

SICP 1.1.6 Conditional Expressions and Predicates

ノート 条件式と述語。 ここで習うのはcond、ifと、=。それからbooleanの値を扱うand、or、not。 If none of the <p>'s is found to be true, the value of the cond is undefined. との事なので、最後に必ずelseを書かないと簡単に不完全なプログラムになって</p>…

SICP 1.1.2 Naming and the Environment 〜 1.1.5 The Substitution Model for Procedure Application

ノート 1.1.2 Naming and the Environment 名前付けと環境。 数値に名前をつけて計算に使う例: > (define size 2) > size 2 > (* 5 size) 10 > (define pi 3.14159) > (define radius 10) > (* pi (* radius radius)) 314.159 > (define circumference (* 2…

SICP 1 Building Abstractions with Procedures

『Sceme手習い』『Scheme修行』と読んで、Schemeの基本的な事が分かった所で、巻末の推薦図書(?)に書いてある『Structure and Interpretation of Computer Programs』を読む事にしました。この本も実際の所Schemeに関する教科書ではないと思いますが、計…

Scheme修行 第20章 店には何がある?

再びここでschemeインタープリタを作成します。サポートするSchemeの仕様はこの本に出て来る仕様そのもので、例えばcall-with-current-continuationはletccとして定義されているし、atom?は組み込みとして定義されます。 ノート: (car (quote ())はエラーと…

Scheme修行 第19章 宝石泥棒(その2)

ここでは文字列解析のtokenizerの様な挙動が紹介されます。木構造のデータを与えると、その中の最も左に出現するアトムを返す。次に呼び出すと次ぎに左側のアトムを返す、と言った挙動です。極めて手続き的と言うか。アトムが見つかった時点で継続を使って脱…

Scheme修行 第19章 宝石泥棒(その1)

Scheme固有の継続の使用方法を習います。 ノート: deepB まず、deepのおさらい。 > (deep 6) ((((((pizza)))))) > deepB 再帰の果てにmが0になった時点でletcc (call-with-current-continuation)して続きの関数を大域変数のtoppingsに設定している事以外は…

Scheme修行 第18章 我変わる、ゆえに我同じなり!

consセルをクロージャーで実現する話。そう言えばSICPでも同じ事をしていた様な…。この章を読んで始めて第6章で登場する『影法師(shadow)』の意味が分かりました。影法師とは同じ事を表現する別の実装の事を指している様です。第6章では普通のS式ではな…

Scheme修行 第17章 我変わる、ゆえに我あり!

計算の結果を保存しておいたり、途中の状況を保存しておく手法を習います。 ノート: deep 最初のdeepの定義は特にメモは保存しないその場限りの定義。関数deepは 引数mに適用する mが0であれば、アトムpizzaである mが0でなければ、(deep (sub1 m))をリスト…

Scheme修行 第16章 位置について、セット、バン!(その2)

set!を使って、グローバルな関数名を参照せずに再帰を行うテクニックを習います。 ノート: length まずは元のlengthの定義から出発。 このlengthと言う名前はグローバルな名前で定義の中から参照している。lengthは組み込み関数として既に定義されているの…

Scheme修行 第16章 位置について、セット、バン!(その1)

set!を使ったテクニックの続きです。 ノート: sweet-tooth 内容的に目新しい事は無いが、やり取りを実際に確かめてみる。 > (define sweet-tooth (lambda (food) (cons food (cons (quote cake) (quote ()))))) > (define last (quote angelfood)) > (let (…

Scheme修行 第15章 大人と子供の違い……

この章ではset!を習います。また分かりにくい形でlambdaが作るクロージャに変数を取り込む方法も習います。これを用いると特定の関数からのみ参照出来る、C言語で言う所の関数内static変数に相当する変数が作れます。 ノート: set! 特に明記されていないが…

Scheme修行 第14章 名前をつけましょう(その3)

式の値を無視して、複数の式を評価するケースを習います。関数値としてはletccにジャンプする事で返すので、途中の段階では関数値を返す必要がありません。 ノート: leftmost leftmostを思い出しましたか。 は話の繋がりが分からないが、原文は『Do you rec…

Scheme修行 第14章 名前をつけましょう(その2)

letを使って余計な計算を避ける方法を習います。 ノート: depth* depth*は 木に適用する関数で 数を値とする その値は 木が空リストであれば、1 木の先頭要素がアトムであれば、木の残り部分にdepth*を適用した値 そうでなければ、 木の先頭より後ろにdepth…

Scheme修行 第14章 名前をつけましょう(その1)

ローカルな変数を作るletを習います。 ノート: leftmost leftmostのおさらい。 leftmostは S式に適用し アトムを値とする その値は S式の先頭要素がアトムの場合、そのアトム S式の先頭要素がアトムでない場合(リストの場合)、そのリストにleftmostを適用…

Scheme修行 第13章 ホップ、スキップ、ジャンプ(その2)

letccの続きです。 ノート: rember remberでもaが不変なのでletrecを用いて再定義出来る。 > (rember 5 '(1 2 3 4 5 6 5 4 3 2 1)) (1 2 3 4 6 5 4 3 2 1) > multiremberではないので最初の5だけが削除される。rember-beyond-firstはあるアトム以降の要素を…

Scheme修行 第13章 ホップ、スキップ、ジャンプ(その1)

ここではcall-with-current-continuationを習います。この本では単にletccと言う名前になっています。処理系によってはcall/ccと言う名前もある様ですが、DrRacketではフルスペルでcall-with-current-continuationが使われています。 ノート: intersectall …

Scheme修行 第12章 避難しましょう(その2)

letrecを使った既出の関数の再定義が続きます。 ノート: union member?のおさらい。ラットの中に指定のアトムが含まれていれば#t。そうでなければ#f。letrecを使って再帰の際にaを渡さない版が定義出来る。関数名のyes?はあまりしっくり来ない。また、letre…

Scheme修行 第12章 避難しましょう(その1)

ローカルな関数を定義する手段としてletrecを習います。letrecを用いる目的は: ローカルな関数を定義してそれに名前をつける事により、Yコンビネータを使わずにかつグローバルな名前を増やさずに再帰関数を定義する。(Yコンビネータを使うには再帰算数をそ…

Scheme修行 第11章 おかえりなさい、ようこそショーへ

随分間があいてしまいましたが『Scheme手習い』に引き続き『Scheme修行』を勉強します。続きなだけに章番号まで続きになんですね。これまでリストに関数を再帰的に適用する場合に空リストから積み上げて結論を得ていました。リストでは右側から考えていた事…

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が空であれば真 それ以外は偽 アトム、空リスト、要素が一つしか無いリストを評価してもエラー…