SICP

SICP §2.3.2(記号微分 その1 [抽象データによる微分プログラム])

数式を受け取り、その微分形式を求めるというお題を使っているセクション。 改めて、和や積を使って表現される数式に対する微分規則はこんな感じ。 dc ─ = 0 (cは定数か、xと異なる変数) dxdx ─ = 1 dxd(u + v) du dv ──── = ─ + ─ dx dx dxd(uv) dv du ─── …

SICP 問題 2.55(クオートの性質?)

問題 Eva Lu Ator は解釈系に対して式 (car ''abracadabra) と入力した。驚いたことに解釈系は quote 印字してきた。なぜか。 解答 ''abracadabra が評価されると、(quote abracadabra) つーリストになる。その car を抽出してるから quote が返るって解釈で…

SICP 問題 2.54(リストの比較?)

問題 二つのリストは、同じ順に並んだ同じ要素を含むとき、equal? であるという。例えば、 (equal? '(this is a list) '(this is a list)) は真である。しかし、 (equal? '(this is a list) '(this (is a) list)) は偽である。より正確には、基本となる eq? …

SICP 問題 2.53(クオートの動作確認)

問題 次の各式を評価した結果、解釈系は何を印字するか。 (list 'a 'b 'c)(list (list 'george))(cdr '((x1 x2) (y1 y2)))(cadr '((x1 x2) (y1 y2)))(pair? (car '(a short list)))(memq 'red '((red shoes) (blue socks)))(memq 'red '(red shoes blue sock…

SICP 問題 2.52(ペインタの総括っぽい感じ)

問題 図2.9に示した wave の square-limit を、上に示した各レベルで作業して変更せよ。特に、 a. 問題 2.49 の基本的 wave ペインタに(例えば笑っているような)線分を加えよ。 b. corner-split で構成されるパターンを(例えば2つでなく、up-split と ri…

SICP 問題 2.51(ペインタの合成)

ご無沙汰しちゃった。。仕事でヘマしてダウナーになっちまったのと、そのあと元気になったけど、休みの日にモデルハウスにひやかしにいったら家を建てたくなっちゃって間取りとか考えすぎちゃって、SICPから離れてしまった。。 一ヶ月ぶりに復帰だ! 問題 ペ…

SICP 問題 2.50(ペインタの変換)

問題 ペインタを水平に逆転する変換 flip-horiz と、ペインタを反時計回りに180度と270度回転する変換を定義せよ。 解答 transform-painter 手続きを使えば一発ですな。 以下の手続きを、前エントリで分離した painter.scm に追記する。 ;水平に逆転する変換…

SICP §2.2.4(図形言語 その9 [ファイルの分割])

さて、前エントリまででものすごくたくさんのコードを生成したわけだが、ちょっとカオス化してきたのでファイルを分割してみようと思う。と言っても難しく考えるわけじゃなく、ただ各種手続きを複数ファイルに分割し、main.scm で load するだけの単純なもの…

SICP §2.2.4(図形言語 その8 [ペインタの変換と組み合わせ])

前回のエントリまでで、やっと実際の描画処理までが繋がったけども、beside とか below とか flip-* 系の実装がまだ空中に浮いたままの状態なんすよ。 これを解決するのが今回のエントリとなる。 肝となる考え方は、ペインタを新しく指定するフレームに沿う…

SICP §2.2.4(図形言語 その7 [ペインタのまとめ])

さ、やっと『ペインタ』のおでましだ。ペインタはフレームを引数として受け取り、そのフレームに合うように描画しようとする手続だ。 ここで、やっとgauche-glとの融合がなされる・・・長かった。。 SICPで記述されているペインタの例は「線画のペインタ」だ…

SICP §2.2.4(図形言語 その6 [フレームの概念のまとめとフレーム座標写像について])

今度は『フレーム』の概念の説明。SICPによると、ペインタの実装方法と組み合わせ方法を考える前に『フレーム』を考えなきゃならんのだって。・・・知らんがな(´・ω・`)。 フレームを構成するのに必要な要素は、次の3つ。 ・原点ベクタ:平面の絶対原点から…

SICP §2.2.4(図形言語 その5 [高階関数としてのペインタの扱い])

次の「高階関数」のサブセクションでは、「ペインタが手続だからできること」を解説してる風。 ;四種類の「ペインタを生成する手続き」を引数で受け取って、 ;左上、左下、右上、右下に描画行うペインタの生成手続きを返却する。 ;(その手続は、引数として…

SICP §2.2.4(図形言語 その4 [ペインタの生成・変換])

前エントリの wave4 は、まず wave2 を定義してから、beside と絡めて生成しているが、wave2 を生成しなくても生成できたりする。 (define (flipped-paires painter) (let ((painter2 (beside painter (flip-vert painter)))) (below painter2 painter2))) (…

SICP §2.2.4(図形言語 その3 [何が理解できていないのか])

記述の仕方にホント悩む。どう書けば俺自身が理解できる進め方にできるだろうか。。 まだ、まとめきれてないが、とりあえずアップしちゃう。あとでまた追記します。 手を動かしてやってみよう。 この図形言語のセクションでは、次の「言語の機能」を使ってそ…

SICPの図形言語のセクションについて

図形言語のセクションがいまいちしっかりと理解できていない原因を考えてみた。 従来のセクションは、セクションの記述内容を読む、あるいは少しだけ手を動かしてみて、その上で問題を解けばほぼ理解できた。 が、今回のセクションはメインストリームがセク…

SICPの図形言語のセクション。。

やばい。。ちゃんと理解できてねぇ。。 参考書の該当セクションの内容、ちゃんと追った方がいいかな。。

SICP 問題 2.49(各種ペインタの定義)

問題 segments->painter を使い、次の基本的ペインタを定義せよ: a. 指定されたフレームの外形を描くペインタ b. フレームの向か側の頂点を結んで「X」を描くペインタ c. フレームの辺の中点を結んで菱形を描くペインタ d. wave ペインタ 解答 まずは segme…

SICP 問題 2.48(有向線分の構成子、選択子を定義する)

問題 平面上の有向線分はベクタの対 ─原点から線分の始点へ向かうベクタと、始点から線分の終点へ向かうベクタ─ で表現できる。問題 2.46 のベクタ表現を使い、この線分の表現を構成子 make-segment と選択子 start-segment 及び end-segment として定義せよ…

SICP 問題 2.47(フレームの選択子を定義する)

問題 フレームの構成子に候補が二つある: ;候補1 (define (make-frame origin edge1 edge2) (list origin edge1 edge2)) ;候補2 (define (make-frame origin edge1 edge2) (cons origin (cons edge1 edge2))) 構成子のそれぞれに、フレームの実装となる適…

SICP 問題 2.46(frameを構成するための各種手続きを定義する)

問題 原点からある点へ向かう二次元のベクタ v は x 座標と y 座標からなる対で表現できる。構成子 make-vect と、対応する選択子 xcor-vect と ycor-vect を作り、ベクタのデータ抽象を実装せよ。その選択子と構成子を使い、ベクタの加算、減算、スカラーに…

SICP 問題 2.45(right-split と up-split を、手続きを返す手続き split を使って具体化してみる)

問題 right-split と up-split は汎用分割演算の具体化として表すことができる。 (define right-split (split beside below)) (define up-split (split below beside)) の評価が既に定義したものと同じ振る舞いの手続き right-split と up-split を作り出す…

SICP 問題 2.44(up-splitを定義)

問題 corner-split で使った手続き up-split を定義せよ。below と beside の働き切り替える他は right-split と同様である。 解答 corner-split と right-split は直前に記載されているのでここに掲載しておこう。 (define (corner-split painter n) (if (=…

SICP §2.2.4(図形言語 その1)

来ました、図形言語。 グラフィックスを表示可能な環境が必要になるわけだが何を使えばいいのやら。。 で、既に SICP やっている方々のブログを見ると、大体皆さん gauche-gl つうのを使用している模様。 ちょいと調べて見たところ、この gauche-gl つうのは…

SICP §2.2.4(図形言語 その2)

最低限の情報収集が完了したか?? とりあえず現時点での経過をメモ。 gauche-gl は既にインストール済みとし、以下の各コードを適当なファイルにコピペして実行権限をつけて実行してみると、段階を追って画面描画ができていることが分かると思うっす。 wind…

SICP 問題 2.43(非効率な queens に関する考察)

問題 Louis Reasoner は問題 2.42 をやるのに恐ろしく時間がかかった。彼の手続き queens は動くように見えたがすごく遅かった。(Louis は 6×6 を解くのさえ、待つわけにいかなかった。)Louis が Eva Lu Ator に助けを求めた時、彼女は彼が flatmap の写像…

SICP 問題 2.42(エイトクイーンパズル)

もんのすげえ時間食った。。トータル4日間?アホだな俺。 問題 「エイトクイーンズパズル」はチェス盤上に八つのクイーンを、どのクイーンも他のと当たりにならないような(つまりどの二つのクイーンも同じ行、同じ列、同じ斜めの筋にならないような)置き…

SICP 問題 2.41(3つの数字の組合わせの全パターンを求める)

問題 与えられた整数 n に対して、n より小さいか等しい相異なる正の整数 i, j, k の順序付けられた三つ組で、和が与えられた整数 s になるものを全て見つけよ。 解答 前問の unique-paires を拡張して unique-3s とかにして、三つ組のリストを生成したのち…

SICP 問題 2.40(全ての相異なる数字による組合わせを求める)

問題 与えられた整数 n に対し、1≦j<i≦n の対 (i, j) の並びを生成する手続き unique-paires を定義せよ。unique-pairs を使って、上の prime-sum-paires の定義を簡単にせよ。 解答 まずは unique-paires から。 「与えられた整数 n に対し、1≦j<i≦n の対…

SICP 問題 2.39(fold-right と fold-left を使って reverse を実装)

【問題】 reverse(問題 2.18)の、問題 2.38 の fold-right と fold-left を使った、次の定義を完成せよ。 (define (reverse sequence) (fold-right (lambda (x y) ) '() sequence)) (define (reverse sequence) (fold-left (lambda (x y) ) '() sequence))…

SICP 問題 2.38(fold-rightとfold-left)

【問題】 accumulate 手続きは、並びの先頭の要素を右方の全ての要素を組み合わせた結果に組み合わせるので、 fold-right としても知られている。逆向きに仕事をしながら要素を組み合わせる他は fold-right と類似な fold-left もある。 (define (fold-left …