研究開発

畳を敷く(4)

第4章 カスタム関数を作ってみる

ここまでで、5つのプログラムができました。
このまま5つのオブジェクトプラグインを作ってもいいのですが、1つにまとめましょう。

本来のカスタム関数(ユーザ定義関数)の使い方は、同じような処理が頻繁に出てくる場合に、関数化してソースコードをまとめることでプログラム変更を容易にする役割がありますが、それ以外にもメイン部分にダラダラと書くのではなく、機能ごとに細分化しプログラムが見やすくする役目もあります。こちらの場合には関数化というより、サブルーチン化と言った方がいいかもしれません。

書き方はメインになる(呼び出す側)プログラムの変数定義(VAR)のところにプログラムをいれます。

PROCEDURE tatami;
VAR
	ii : INTEGER;

	PROCEDURE SubRoutine;{関数の宣言}
	BEGIN
	END;

BEGIN{メイン}
	SubRoutine;
END;
Run( tatami );

各関数は畳数となりますので、この部分もパラメータ化(pTType)しておきましょう。
変数の内容によって、描く畳数(実行する関数)がかわるようにIF文を使って分岐させます。
pTTypeに文字列として「四畳半」「六畳」「八畳」「十畳」「十二畳」が入ってくると各畳数が描かれます。

PROCEDURE tatami;
CONST
	pTSize = 880.0;
	pTAtumi = 60.0;
	pTType = '四畳半';
{	pTType = '六畳';}
{	pTType = '八畳';}
{	pTType = '十畳';}
{	pTType = '十二畳';}
VAR
	ii : INTEGER;

	PROCEDURE tatami45;
	BEGIN
		BeginXtrd( 0, pTAtumi );
			Rect( 0.0, 0.0, pTSize*2, pTSize );
			Rect( pTSize*2, 0.0, pTSize*3, pTSize*2 );
			Rect( 0.0, pTSize, pTSize, pTSize*3 );
			Rect( pTSize, pTSize*2, pTSize*3, pTSize*3 );
			Rect( pTSize, pTSize, pTSize*2, pTSize*2 );
		EndXtrd;
	END;

	PROCEDURE tatami6;
	BEGIN
		BeginXtrd( 0, pTAtumi );
			Rect( 0.0, 0.0, pTSize, pTSize*2 );
			Rect( pTSize, 0.0, pTSize*3, pTSize );
			Rect( pTSize, pTSize, pTSize*3, pTSize*2 );
			Rect( pTSize*3, 0.0, pTSize*4, pTSize*2 );
			Rect( 0.0, pTSize*2, pTSize*2, pTSize*3 );
			Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 );
		EndXtrd;
	END;

	PROCEDURE tatami8;
	BEGIN
		BeginXtrd( 0, pTAtumi );
			Rect( 0.0, 0.0, pTSize*2, pTSize );
			Rect( pTSize*2, 0.0, pTSize*4, pTSize );
			Rect( 0.0, pTSize, pTSize, pTSize*3 );
			Rect( pTSize, pTSize, pTSize*3, pTSize*2 );
			Rect( pTSize, pTSize*2, pTSize*3, pTSize*3 );
			Rect( pTSize*3, pTSize, pTSize*4, pTSize*3 );
			Rect( 0.0, pTSize*3, pTSize*2, pTSize*4 );
			Rect( pTSize*2, pTSize*3, pTSize*4, pTSize*4 );
		EndXtrd;
	END;

	PROCEDURE tatami10;
	BEGIN
		BeginXtrd( 0, pTAtumi );
			Rect( 0.0, 0.0, pTSize, pTSize*2 );
			Rect( 0.0, pTSize*2, pTSize, pTSize*4 );
			Rect( pTSize, 0.0, pTSize*3, pTSize );
			Rect( pTSize*3, 0.0, pTSize*5, pTSize );
			Rect( pTSize, pTSize, pTSize*2, pTSize*3 );
			Rect( pTSize*2, pTSize, pTSize*4, pTSize*2 );
			Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 );
			Rect( pTSize*4, pTSize, pTSize*5, pTSize*3 );
			Rect( pTSize, pTSize*3, pTSize*3, pTSize*4 );
			Rect( pTSize*3, pTSize*3, pTSize*5, pTSize*4 );
		EndXtrd;
	END;

	PROCEDURE tatami12;
	BEGIN
		BeginXtrd( 0, pTAtumi );
			Rect( 0.0, 0.0, pTSize, pTSize*2 );
			Rect( 0.0, pTSize*2, pTSize, pTSize*4 );
			Rect( pTSize, 0.0, pTSize*3, pTSize );
			Rect( pTSize*3, 0.0, pTSize*5, pTSize );
			Rect( pTSize, pTSize, pTSize*2, pTSize*3 );
			Rect( pTSize*2, pTSize, pTSize*4, pTSize*2 );
			Rect( pTSize*2, pTSize*2, pTSize*4, pTSize*3 );
			Rect( pTSize*4, pTSize, pTSize*5, pTSize*3 );
			Rect( pTSize, pTSize*3, pTSize*3, pTSize*4 );
			Rect( pTSize*3, pTSize*3, pTSize*5, pTSize*4 );
			Rect( pTSize*5, 0.0, pTSize*6, pTSize*2 );
			Rect( pTSize*5, pTSize*2, pTSize*6, pTSize*4 );
		EndXtrd;
	END;

BEGIN
	IF pTType = '四畳半' THEN
	BEGIN
		tatami45;
	END
	ELSE IF pTType = '六畳' THEN
	BEGIN
		tatami6;
	END
	ELSE IF pTType = '八畳' THEN
	BEGIN
		tatami8;
	END
	ELSE IF pTType = '十畳' THEN
	BEGIN
		tatami10;
	END
	ELSE IF pTType = '十二畳' THEN
	BEGIN
		tatami12;
	END
	ELSE
	BEGIN
		BeginXtrd( 0, pTAtumi );
			Rect( 0.0, 0.0, pTSize, pTSize );
		EndXtrd;
	END;
END;
Run( tatami );