プロシージャ
Jasmine Tea では、プログラムの中で数多くの命令を使うことができます。コンピューターは、それぞれの命令で決められた動作を行います。そして、複数の命令を組み合わせていくことで、複雑な計算を行い、画面に図形などを表示し、結果として役に立つプログラムを作成することができます。
Jasmine Tea が提供する命令は、比較的単純な動作がほとんどです。例えば、グラフィック画面に図形を表示する命令は、以下のようなものがあります。
- pset 命令 - 点を描く。
- line 命令 - 線を描く。
- box 命令 - 四角形を描く。
- circle 命令 - 円を描く。
- paint 命令 - 図形の中を塗りつぶす。
それぞれの命令の動作は単純ですが、命令を複数組み合わせることで、複雑なことを行うことができます。例えば、以下のプログラムは、正五角形をグラフィック画面に描画する例です。
cls
// 中心のX座標
x=300
// 中心のY座標
y=200
// 中心から各頂点までの距離
r=100
// 頂点の数
n=5
// 線の色
c=7
x1=x
y1=y+r
d=360/n
for i=1 to n
x2=x+r*sin(i*d)
y2=y+r*cos(i*d)
line (x1,y1)-(x2,y2),c
x1=x2
y1=y2
next
上のプログラムでグラフィック画面に描画される多角形の数は、1つのみです。これを2つに増やしたいときは、プログラムの内容を下にコピーすれば実現できます。では、もっと多くの図形を描きたいとしたら、どうでしょうか?同じような行が何回も続いてしまいます。さらに、多角形を連続して 1000 回描きたいとなれば、行をコピーしていくことは現実的とは言えません。
プロシージャの作成方法
Jasmine Tea では、複数の命令をまとめて「プロシージャ」を作ることができます。プロシージャとは、自分独自の命令を作り出すことと考えることもできます。プロシージャに名前をつけることで、call 命令によっていつでもプロシージャを実行することができます。
上記の正五角形を描くプログラムを、プロシージャとして作り直した例が、以下となります。
cls
call polygon 300,200,100,5,7
procedure polygon x,y,r,n,c
x1=x
y1=y+r
d=360/n
for i=1 to n
x2=x+r*sin(i*d)
y2=y+r*cos(i*d)
line (x1,y1)-(x2,y2),c
x1=x2
y1=y2
next
end procedure
プロシージャは、procedure 命令を使って作ることができます。procedure 命令は、パラメーターとしてプロシージャの名前と、プロシージャの中で必要となる数値や文字列を受け取るための変数(これを仮引数と呼びます)を記載します。上記のプログラム例では、プロシージャの名前として、多角形を意味する polygon という名前をつけています。そして、以下の仮引数を作っています。
- x - 正多角形の中心の X 座標
- y - 正多角形の中心の Y 座標
- r - 正多角形の中心から各頂点までの距離
- n - 頂点の数
- c - 線の色
この例では、すべての仮引数は数値変数となりますが、文字列変数として仮引数を作ることもできます。
polygon プロシージャで実行する命令群は、procedure 命令から end procedure 命令の間に書きます。仮引数として作成した変数に渡された数値を使って、正多角形をグラフィック画面に描画しています。
プロシージャは、call 命令を使って実行することができます。上のプログラム例では、2行目で call 命令を使って polygon プロシージャを実行しています。call 命令によって、2行目から5行目にジャンプします。
call 命令では、実行したいプロシージャの名前だけでなく、そのプロシージャに書かれた仮引数に渡す数値や文字列(これを実引数と呼びます)を書く必要があります。上記のプログラム例では、以下のように実引数を指定しています。
- 300 - 正多角形の中心の X 座標として、仮引数 x に記憶される
- 200 - 正多角形の中心の Y 座標として、仮引数 y に記憶される
- 100 - 正多角形の中心から各頂点への距離として、仮引数 r に記憶される
- 5 - 正多角形の頂点の数として、仮引数 n に記憶される
- 7 - 正多角形の辺の色として、仮引数 c に記憶される
プログラムを実行すると、正五角形がグラフィック画面に描画されます。
プロシージャには、実引数の値を変化させながら、何度も実行することができて、しかもプログラム内で同じ処理を何度も書く必要がなくなる、という利点があります。例えば、以下のプログラム例のように、ランダムに正多角形を無限に描画するプログラムを書くことができるようになります。
cls
do
x=random(50,639-50)
y=random(50,399-50)
r=random(10,50)
n=random(3,6)
c=random(1,7)
call polygon x,y,r,n,c
loop
procedure polygon x,y,r,n,c
x1=x
y1=y+r
d=360/n
for i=1 to n
x2=x+r*sin(i*d)
y2=y+r*cos(i*d)
line (x1,y1)-(x2,y2),c
x1=x2
y1=y2
next
end procedure
上記のプログラムを実行すると、グラフィック画面の色んな場所に、正三角形から正六角形までの図形が様々な色で永遠と描画され続けます。
このように、プロシージャを作ることで、自分ならではの命令を自作することが可能になります。プログラミングをしていて、同じような処理を何度も行うことが必要と気がついたときには、その処理をプロシージャとして作成してみてください。
変数のスコープ
Jasmine Tea のプログラムは、様々な情報を記憶しておくために、変数を使うことができます。1つの変数には、数値または文字列を1つ記憶しておくことができます。また、複数の数値または文字列を1つの変数で扱うことが可能になる配列を使うこともできます。
基本的には、プログラムのどの行でも、変数を使うことができます。しかし、ある行で作られた変数が、特定の行からは使えない、という状況があります。
Jasmine Tea のプログラムは、1行目から順に実行されます。実行が開始されたときに、Jasmine Tea は内部で「メイン変数スコープ」と呼ばれる変数の記憶領域が作られます。下図は、1行目にて作られた変数 x がメイン変数スコープの中に作られている様子です。
call 命令によってプロシージャにジャンプする際に、Jasmine Tea では新しく変数スコープを作成します。
上図では、3行目の call 命令によって、6行目から9行目の polygon プロシージャにジャンプしています。この際に、Jasmine Tea は polygon プロシージャ向けに、新規に変数スコープの記憶領域を作成します。そして、call 命令によってプロシージャに渡された数値や文字列は、仮引数として書かれた変数として polygon 変数スコープに作成されます。つまり、メイン変数スコープに存在する変数 x と、polygon 変数スコープに存在する変数 x は、名前は同じですが、別の変数です。
異なる変数スコープに記憶されている変数は、使うことができません。例えば、メイン変数スコープに変数 y が存在していたとしても、polygon プロシージャの中からは利用することができません。そのため、作成したプロシージャの中で必要となる数値や文字列は、必ず仮引数として記載しておき、call 命令のパラメーターによって渡されるようにしておく必要があります。
call 命令によってプロシージャを実行する度に、新規に変数スコープが作成されます。例えば、polygon プロシージャの中から call 命令を使って再度 polygon プロシージャを呼び出す(これを再帰呼び出しと言います)際にも、新規に変数スコープが作成されますので、注意しましょう。