SICP §2.2.4(図形言語 その3 [何が理解できていないのか])
記述の仕方にホント悩む。どう書けば俺自身が理解できる進め方にできるだろうか。。
まだ、まとめきれてないが、とりあえずアップしちゃう。あとでまた追記します。
手を動かしてやってみよう。
この図形言語のセクションでは、次の「言語の機能」を使ってその能力を理解するのが目的な感じ?
○閉包(lambda使って手続きを返すようなやつ)
○高階手続き
大筋としては、『ペインタ』や、『フレーム』の変換処理を「手続き」として実装する。
①から実例を掲載していってみたいところだが、ここでしょっぱなからつまづく。
① 「『ペインタ』を生成する手続き」を定義する。
② ①により、『ペインタ』を様々な形に合成することができる。
③ 生成された『ペインタ』は、『フレーム』を引数に受け取ることで実際の描画を行う。
④ 『フレーム』は、基本となる位置のベクタ、フレームを形成する2つのベクタで構成される。
⑤ 『フレーム』はベクタ変換手続きを使用することでフレームそのものを変換できる。
「『ペインタ』を生成する手続き」はようするにlambda式返せばいいんだろう?と一応イメージできるんだが、「じゃ、具体的にどうやって動作を確認する?」と考えると…どうしていいか分からなくなってしまう。
つまりlambda式の中の実装をどうすればいいのかが分からんってことね。
「SICP §2.2.4(図形言語 その2)」で、gauche-glを使用した実際に描画可能なサンプルを作ってみたが、次の段階であるペインタを絡めた概念にまで脳内で昇華できてないということ。
というわけで、小市民的感覚だと、何とかしてそこをつなげたいところ。。
下のコードはペインタやフレームを脳内にイメージするためのコードなので動かないが、
つなげたい直前の状態。(disp手続きの内部にてコメントに挟んで記述している箇所がそれ。)
#!/usr/bin/gosh (use gl) (use gl.glut) (define (init) (gl-clear-color 1.0 1.0 1.0 1.0)) (define (disp) (gl-clear GL_COLOR_BUFFER_BIT) (gl-color 0.0 0.0 0.0 0.0) (gl-begin GL_LINE_LOOP) ;ここの部分で『ペインタ』と『フレーム』を生成、それらを使用して描画する。 (define painter (①のペインタを生成する手続き)) (define frame (フレームを生成する手続き)) (painter frame) ;ここまで (gl-end) (gl-flush)) (define (main args) (glut-init args) (glut-create-window "Painter Line Test") (glut-display-func disp) (init) (glut-main-loop) 0)
SICPの方では『ペインタ』はもうあるものとして、ペインタの合成にすっとんでいる。。
;"wave"というのが基本となるペインタとする。 ;wave2 は、左側に wave を、右側に「上下逆転した wave」を合成したペインタ (define wave2 (beside wave (flip-vert wave))) ;wave4 は、wave2 を上下に合成したペインタ (define wave4 (below wave2 wave2))
何がしたいのかは何となくわかる。が、どうしても「じゃあ具体的に『ペインタ』はどう実装するのよ?」という疑問が残り、ペインタの実態のイメージがつかめていないので、「beside とか below ってどう実装するのよ?」という新たな疑問が発生する。
SICPでは、「ペインタを手続として実装する、という方針を貫いていればあとでどうとでもなるぜ」的なことを言っていて(まぁ実際そうなんだろうけど)、そのままペインタの変換・生成の話に移ってしまっている。。
疑問点
とりあえずここまで整理してみて、「どこが曖昧だったのか」が明らかになったのでまとめておこう。
これらを頭の片隅に置いといて、ひとまずSICPの流れで話を先に進めてみよう。
・具体的な『ペインタ』の実装の仕方。
・beside、below の定義。