2008-06-01から1ヶ月間の記事一覧

問題4-30

eval-sequence内で渡された式の並びに対して、一つずつactual-valueをしなければならないのではないかというCyの疑問について考えます。 aでBenが書いている手続きが、evalでも上手く動く理由としては、例え並びの要素がthunkされていたとしても、それ自身が…

問題4-25〜26

「4.2 Schemeの変形 --- 遅延評価」に入りました。自前評価器を機能拡張していきます。こういうことができると、その機能を低水準言語やハードウェアに実装する前に、その動きを自前評価器を使ってシミュレーションすることができるということが冒頭に述べられ…

問題4-27〜28

「4.2.2 遅延評価の解釈系」では、合成手続きの引数は実際に必要とされるまで評価しない、ノンストリクトな正規順序的処理を行なうように自前評価器を改良します。applyの中で、procedureが合成手続きだったならば、渡された実引数にdelay-itしてthunk?という…

問題4-29

この問題では、メモ化するのとしないのとで、振る舞いがどう変わるかを調べます。下記のような定義が存在していて、 (define count 0) (define (id x) (set! count (+ count 1)) x) (define (square x) (* x x)) メモ化をしない場合は、 (square (id 10)) ;=…

4.1 超循環評価器

「4.1.7 構文解析を実行から分離する」の中にある問題4-22〜24は飛ばしました。解析と実行を分離すれば、同じ式を何度も解析しなくて済むようになるということはわかりましたが、一度解析された結果が、どこでどのように保持され、再利用されるのかということ…

問題4-21

問題4-18〜20は深追いしませんでしたが、感じたことを一応メモしておきます。 問題4-18については、別名の束縛変数に元々のdefine式の本体を放り込んで、その後にset!で投入するという方法のようですが、これだとsolveのdyの本体をbに束縛する時、その中でy…

問題4-15

「4.1.5 プログラムとしてのデータ」では、これまでに説明されてきた評価器は万能機械であるという視点について述べられています。プログラムそのものも、評価器にとってはデータなのだということで、非常に興味深く読み進めました。注釈19には、Turing機械に…

問題4-16

「4.1.6 内部定義」に入りました。四章の第一節もゴールが見えてきましたが、このトピックは問題が多く、しかも一筋縄では解けそうにないので、ちょっと参っています。 問題4-16を解く前に、問題4-6で定義した自前のletが正しく動くかを試してみました。結果は…

問題4-14

「4.1.4 評価器をプログラムとして走らせる」ということで、これまでに本文の中で登場してきた手続き達をコピペして、実際にevalを通せるようにしました。コピペなので動いて当然ですが、それでも今まで解読してきたことが実行されるのを確認できたということ…

問題4-11〜13

「4.1.3 評価器のデータ構造」では評価器の内部的なロジック、特に環境を操作するための定義の詳細について述べられています。「3.2 評価の環境モデル」を読み返しながら、本文で描かれているコードを解読していきました。 問題4-11。フレームの表現方法を変更し…

問題4-7〜8

問題4-7。nested-lets式を普通のlet式に変換します。以下のようなnested-lets式を、その下のlet式に変換することを目的とします。 ;;変換前 (let* ((x 3) (y (+ x 2)) (z (+ x y 5))) (* x z)) ;;変換後 (let ((x 3)) (let ((y (+ x 2))) (let ((z (+ x y 5)…

問題4-4〜6

問題4-4。andとorの式を扱えるようにします。eval手続き内で、 (define (eval exp env) (cond (..) ;;others ((and? exp) (eval-and (and-predicates exp) env)) ((or? exp) (eval-or (or-predicates exp) env)) ;;others )) のような型判別と評価を行なうこ…

問題4-2〜3

「4.1.2 式の表現」ということで、evalに渡された式が何者で、それをどう評価するべきなのかということが述べられています。渡された式が変数なのか、何かを定義するのか、純粋に作用させる式なのか。それらをcond式で判別して、式の形式がわかったら然るべき…

問題4-1

第四章「超言語的抽象(metalinguistic abstraction)」に入りました。本章の冒頭では、いきなり野心的なことが述べられています。 新しい言語を創設する超言語的抽象は、工学的設計のすべての分野で重要な役割を果す。これはプログラミングにおいて、新しい言語…

問題3-69〜70

問題3-69。pairsの拡張版であるtriplesを定義します。triplesの内部でpairsを使うという発想が浮かばなかったため、全ての組み合わせを洗い出せなかったり、同じ組み合わせが重複して出現してしまったりと、いろいろ試行錯誤してしまいました。Pythagorasの…

問題3-73〜76

「信号としてのストリーム」というトピックです。電気回路の仕組みについては興味はあるものの、なかなか手をつけられていないのが現状です。そのため、問題を一応は解いてはみましたが、問題に書かれていることをそのままコードとして表現しただけで、その正…

問題3-77〜78

「3.5.4 ストリームと遅延評価」に入りました。短いトピックですが、delayとforceに関する非常に興味深い内容が説明されています。まだまだ理解が曖昧なところもありますが、cons-streamの内部で行なわれているdelayに頼らなくても、明示的にdelayを定義するこ…

第三章、ひとまず終了

「第3章 標準部品化力、オブジェクトおよび状態」を読み終えました。代入や局所状態変数から始まり、ディジタル回路のシミュレータの動きを追いながら感動と苦悩を味わい、共有資源を扱う際に発生する問題点について考え、さらに、それを回避するための一つの…

問題3-66〜68

「対の無限のストリーム」というトピックで、任意の対を無限に並べたように見えるストリームを扱います。 問題3-66。本文に掲載されているpairsの動きを調べます。(pairs integers integers)がどのようなストリームになっているのかを100個くらい出力し、その…

問題3-63〜65

問題3-59〜62は、数学的な要素が多分に含まれていて、今の自分には問題を解いたとしても正否を判定できないので飛ばしました。 そんなわけで、「3.5.3 ストリームパラダイムの開発」に入りました。代入を使うことなく、何らかの計算結果をstreamに追加していき…

問題3-53〜55

「3.5.2 無限ストリーム」に入りました。こういう風にリストを定義すると、永遠に続く配列を表現できるということが驚きでした。このトピックは問題がたくさんあるので、それらを解きながら、理解を深めていきたいと思います。 問題3-53。stream-carの値を足し…

問題3-56〜58

問題3-56。2の倍数のストリーム、3の倍数のストリーム、5の倍数のストリームをマージして、一つのストリームに作成するためには、以下のような手続きを定義します。 (define S (cons-stream 1 (merge (scale-stream integers 2) (merge (scale-stream intege…

問題3-50〜52

「3.5 ストリーム」の節に入り、「遅延評価」という概念が登場してきました。「遅延評価」という言葉そのものは、様々なブログで紹介されていて興味を持っていましたが、それが一体何なのかということは全く知りませんでした。まだ冒頭の数ページしか読んでいませ…

問題3-43〜45

昨日の続きで、共有資源を複数のプロセスがアクセス・変更する際に発生する問題点について考察していきます。 問題3-43。二つの口座の残高差分を交換するexchangeですが、exchange手続き全体を直列化しないと、以下のような問題が発生する可能性があります。…

問題3-46〜49

この部分では、mutexが登場し、make-sirializerの実装が紹介されています。さらに、デッドロックについても言及されています。 問題3-46。mutexが保持しているフラグを調べ、利用可能ならばフラグを上げる手続きであるtest-and-set!ですが、この中には、「フ…

制約の拡散(問題3-33〜37)

「3.3.5 制約の拡散」の節は、ディジタル回路のような「遅延」は絡んでいないものの、未定義コネクタに値をセットした後、その値が制約に従って伝播していく様子などに見られる、コネクタや制約の仕組みが面白いと感じました。 問題3-33は、averagerを定義する問…

問題3-38〜42

「3.4 並列性:時が本質的」に入りました。この節で述べられているようなことをしっかりと理解しておかないと、再現困難なバグを生み出してしまうので、本書だけでなく、様々な文献に当たりながら知見を深め、それを日常のプログラミングに反映させていきたい…

ディジタル回路のシミュレータ(問題3-28〜32)

ここ最近、体調を崩していたため、勉強日記の更新が滞ってしまいましたが、少しずつリカバリーしていきたいと思います。 「3.3.4 ディジタル回路のシミュレータ」の節は、読み物として非常に面白く、問題量としては多くないものの、サンプルコードを読み解くの…