« ThunderbirdからGmail経由で携帯メールを送る | トップページ | Perlで図形言語2 »

2007年3月10日 (土)

Perlで図形言語

最近SICPという本をを読んでいます。
図形言語のところまで一応読み終わりました。

参考にしているサイトの一つがひげぽん OSとか作っちゃうかMona-なのですが、
図形言語の終わりの辺りにて

これを PerlやHakellなどのほかの言語で書く人が現れたら面白そうですね。

とあり、確かに面白そうだと思いPerlでやってみました。

とりあえず、できたものは↓です。
Sicp_picture


コードは

#!/usr/bin/perl -w
use strict;
use Tk;
require "picture.pl";

my @segments = (&make_segment(&make_vect(0.00, 0.80), &make_vect(0.15, 0.65)),
                        &make_segment(&make_vect(0.15, 0.65), &make_vect(0.25, 0.70)),
                        &make_segment(&make_vect(0.25, 0.70), &make_vect(0.35, 0.80)),
                        &make_segment(&make_vect(0.35, 0.80), &make_vect(0.35, 1.00)),
                        &make_segment(&make_vect(0.65, 1.00), &make_vect(0.70, 0.80)),
                        &make_segment(&make_vect(0.70, 0.80), &make_vect(0.65, 0.70)),
                        &make_segment(&make_vect(0.65, 0.70), &make_vect(0.75, 0.70)),
                        &make_segment(&make_vect(0.75, 0.70), &make_vect(1.00, 0.40)),
                        &make_segment(&make_vect(1.00, 0.20), &make_vect(0.65, 0.45)),
                        &make_segment(&make_vect(0.65, 0.45), &make_vect(0.70, 0.00)),
                        &make_segment(&make_vect(0.65, 0.00), &make_vect(0.50, 0.20)),
                        &make_segment(&make_vect(0.50, 0.20), &make_vect(0.35, 0.00)),
                        &make_segment(&make_vect(0.25, 0.00), &make_vect(0.35, 0.55)),
                        &make_segment(&make_vect(0.35, 0.55), &make_vect(0.30, 0.60)),
                        &make_segment(&make_vect(0.30, 0.60), &make_vect(0.25, 0.50)),
                        &make_segment(&make_vect(0.25, 0.50), &make_vect(0.00, 0.40)));

my $width  = 300;
my $height = 300;
my $top = MainWindow->new();
my $canvas = $top->Canvas(width => $width, height => $height);

my $frame = &make_frame(&make_vect(0, 0), &make_vect(300, 0), &make_vect(0, 300));
my $func = &segments_painter($canvas, @segments);
my $func2 = &flip_vect($func);
my $func3 = &below($func2, $func2);
my $func4 = &beside($func2, $func3);
&$func4($frame);

$canvas->pack();
MainLoop();

こんな感じ。
間単に説明すると、
"picture.pl"が図形を操作するためのライブラリ。
始めに、@segmentsが線の集合を宣言。
ウィンドウと描画領域を作り、そこにに線を描いていく。

 

図形描画にはTkを使用しました。
基本的にはSICPに載っていたコードや、練習問題で作ったコードを
Perlに翻訳していっただけです。

描画処理のタイミングの問題か、再帰的に行う描画(こういうの)は
うまくいきませんでした。
まあ、結構面白かったし、Perlのリファレンスに慣れることができたし良かったです。

|

« ThunderbirdからGmail経由で携帯メールを送る | トップページ | Perlで図形言語2 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/126478/14207442

この記事へのトラックバック一覧です: Perlで図形言語:

« ThunderbirdからGmail経由で携帯メールを送る | トップページ | Perlで図形言語2 »