関数型言語の勉強にSICPを読もう - (18) 2章 - データによる抽象の構築 - 2.2.4 図形言語 解説とソース
この言語では組み合わされたオブジェクトはリスト構造ではなく、手続きとして表現されている
おそらくここが一番大事なのではないかと考えます。
ただ実際にコードを書いて動かしてみないと理解するのは正直厳しいです。
transform-painter
(define (transform-painter painter origin corner1 corner2) (lambda (frame) (let ((m (frame-coord-map frame))) (let ((new-origin (m origin))) (painter (make-frame new-origin (sub-vect (m corner1) new-origin) (sub-vect (m corner2) new-origin)))))))
これが直感的にかなり分かりづらかった。
まずtransform-painterが「frameを引数にとる手続き」を返す手続きであることが分かります。
言い換えれば、painter を返す手続きです。(painterも手続きなのでややこしいですが。)
さらにletが入れ子になっていて慣れないので一瞬目が点になります。
mには、将来手続きに渡されるであろう frame の座標系への変換を行う手続きを代入しています。
これさえ分かれば、あとは origin , corner1, corner2によって定義されるframeを作りそこに描画してあげればOKです。
図形言語まとめ
詳細な説明はソースとSICPを読んでもらえば良いとして、ポイントは
などなどを構築・理解すること。
そして、それらを利用することで描画の詳細を知ることなくpainter をあれこれいじる手続きを書いていけるという面白さが分かれば良いのではないでしょうか。
ソース
今回使用したソースファイルを置いておきます。
OpenGLの描画の部分はこの問題の本質とは関係ない部分なのでコピペでも良いかと思います。
source.tar.gz
蛇足
id:hideokiとちらっと話したのですがこれを PerlやHakellなどのほかの言語で書く人が現れたら面白そうですね。
と、言ってみるテスト。
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404
読書速度を測ろう - 目指せ速読
id:kmt-tさんのところにあったネタです。(id:kmt-t:20060420#1145530633)
読書速度測定で自分の読書速度を測ることができます。
ちょうど昨日の夜、SICPをもっと早く読むことができれば人生の効率が良くなるのにとか思っていたので測ってみました。
Σ(゚д゚lll)ガーン。遅い・・・。
これは何とかしないとまずそう。
誰かほかの人と比べたいので本を読むのが速そうな人にidトラックバック!
- id:yaneurao師匠
- id:mjtさん
すごい結果が出たらぜひとも教えてください>ALL
というかプログラマ向けの速読の方法が知りたい。
amazonだと↓が割と評判が良さそうだけれども。
追記:
id:adramine:20040105:p6によるとid:adramineさんは 4000 overらしい。