[flash][scheme][SICP] Flashで図形言語の描画ツールを作りました(SICP2章の話)

このGW中、ずっと計算機プログラムの構造と解釈(通称SICP)を読みふけっておりました。

この本はいわゆる計算機科学の入門書で、本の中に出てくるプログラムはLISPの方言であるschemeで書かれており、
慣れないと少し取っ付きづらい本です。

この本の2章に「図形言語」という節では、schemeを使って図形描画を行ってみるという部分があります。

私は普段Macbookgaucheというschemeの処理系をインストールしてプログラムを書いています。
この「図形言語」のプログラムをgaucheで書くにはOpen GL拡張であるgl-gaucheをインストールする必要があります。
id:higeponさんのこのエントリーを参考にしながらやってみたところ、
インストールはうまく行きました。しかし、起動するとX関係のエラーが出て動きませんでした。

問題を解くためだけに環境をあれこれいじるのも不毛だと感じ、プログラムを動かすのをあきらめて、とりあえず本だけ読みすすめていくことにしました。
図形言語の中盤あたりまで読んでみると、どうやら直線を引くぐらいができれば良いということが分かり、
それならFlashで速攻できるのでは?と思い、勢いあまってFlashで描画部分を作ってみました。

下の絵は、今回作成した描画ツールを使って書きました。(実装の本体はschemeで、Flashでは線引いてるだけですがw)


使い方

p.80あたりまで読むと手続きdraw-lineの実装が何処にも書いてなくて萎えますが、以下のdraw-lineを自分のプログラムに
組み込んで下さい。

(define (draw-line v1 v2)
    (display (xcor-vect v1))
    (display ",")
    (display (ycor-vect v1))
    (display ",")
    (display (xcor-vect v2))
    (display ",")
    (display (ycor-vect v2))
    (newline))

draw-lineは2つのベクターv1,v2を引数にとり、そのx座標とy座標をカンマ区切りで出力します。

また、実際にペインターで描画するときに渡すフレームは次の定義を使って下さい。

(define canvas-frame (make-frame (make-vect 0 0) (make-vect 400 0) (make-vect 0 400)))

以上で、描画の準備は整いました。
あとは、

(wave canvas-frame)

という風に、paintercanvas-frameを適用させれば次のようなcsv形式の座標データが得られます。

0.0,332.0,72.0,280.0
72.0,280.0,104.0,300.0
104.0,300.0,160.0,300.0
160.0,300.0,140.0,348.0
140.0,348.0,160.0,400.0
240.0,400.0,260.0,348.0
260.0,348.0,240.0,300.0
240.0,300.0,304.0,300.0
304.0,300.0,400.0,100.0
0.0,296.0,80.0,184.0
80.0,184.0,104.0,260.0
104.0,260.0,152.0,200.0
152.0,200.0,112.00000000000001,0.0
160.0,0.0,200.0,80.0
200.0,80.0,240.0,0.0
300.0,0.0,260.0,200.0
260.0,200.0,400.0,40.0
168.0,320.0,200.0,308.0
200.0,308.0,231.99999999999997,320.0

これを描画Flashの右側のテキストエリアにコピペして「描画」ボタンを押すと、

こんな画像が表示されます。

追記(5/8)

座標形とデータのフォーマットについての説明が不足していたので追記しておきます。

このツールの座標形は、MITのschemeにあわせて左下(0,0)で右上(400,400)になっています。なので、SICPの練習問題はそのままで動きます。

また、数値の並びは、

x1,y1,x2,y2

となっており、1行が線分(x1,y1)-(x2,y2)を表しています。

まとめ

とりあえず、環境構築しなくてもコピペの手間を惜しまなければ図形言語の問題を解ける環境ができました。

ここで取り上げられている内容はかなり興味深いので面倒だからパスしてしまった人もこれを機に再挑戦してもらえればありがたいです。

計算機プログラムの構造と解釈

計算機プログラムの構造と解釈