関数型言語の勉強に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