関数型言語の勉強に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がframeに描画される部分(Open GLとのつながりの部分)
  • frame座標写像の手続き
  • frameの変換を利用した変形

などなどを構築・理解すること。
そして、それらを利用することで描画の詳細を知ることなくpainter をあれこれいじる手続きを書いていけるという面白さが分かれば良いのではないでしょうか。

ソース

今回使用したソースファイルを置いておきます。
OpenGLの描画の部分はこの問題の本質とは関係ない部分なのでコピペでも良いかと思います。
source.tar.gz

蛇足

id:hideokiとちらっと話したのですがこれを PerlやHakellなどのほかの言語で書く人が現れたら面白そうですね。
と、言ってみるテスト。


※「SICPを読もう」の目次はこちら


計算機プログラムの構造と解釈
Gerald Jay Sussman Julie Sussman Harold Abelson 和田 英一
ピアソンエデュケーション (2000/02)
売り上げランキング: 56,404