procedure

働き

プロシージャを作成します。

文法

procedure <名前> [<仮引数1>[,<仮引数2> …]]
  • 名前 - プロシージャの名前
  • 仮引数 - 仮引数の名前

説明

プロシージャとは、複数の命令や処理を1つにまとめて名前をつけたものです。procedure 命令は、プロシージャを作るときに利用します。

プロシージャと独自関数は、戻り値の有無や使用可能な場所が異なります。

  • プロシージャ - 命令と同じように使用します。式の中では使えません。戻り値がありません。
  • 独自関数 -式の中で使用します。命令と同じようには使えません。 戻り値があります。

複数の命令によって実現する機能に名前をつけてプロシージャとすることで、call 命令を使ってプロシージャをいつでも呼び出すことができるようになります。これには以下の利点があります。

  • 何度も同じような命令の羅列を書く必要がなくなります。
  • 複数の命令の呼び出しの結果行われる処理に名前がつくことで、プログラムの可読性が向上します。
  • プロシージャから更にプロシージャを呼び出す(再帰呼び出しと呼びます)ことで、アルゴリズムの記述がより簡潔になります。

プロシージャは、procedure 命令から end procedure 命令の間に書かれた複数の命令が対象となります。同じ名前のプロシージャを複数作ることはできません。

プロシージャは専用の変数の格納領域を持ちますので、他のプロシージャやプロシージャ外で作られた変数を利用することはできません。また、同じ名前のプロシージャでも、call 命令の呼び出しごとに、変数の格納領域は別となります。

call 命令によってプロシージャを呼び出すときに、値(実引数)を渡すことができます。渡された値をプロシージャが受け取るために、仮引数という変数を procedure 命令に記述します。例えば、age という名前の仮引数を procedure 命令に記述したとすると、call 命令にて 47 を指定した場合は、そのプロシージャ内で age という名前の数値変数が作られて、値として 47 が自動的に代入されます。

仮引数は、1つのプロシージャで複数書くことができます。ただし、同じ名前の仮引数を作ることはできません。

プロシージャから別のプロシージャを呼び出すことができますが、その回数が 1000 回以上となるとエラーとなります。

call 命令によってプロシージャが呼び出された際には、対象となる procedure 命令の次の行から実行されます。もし procedure 命令が書かれた行が実行された場合は、そのプロシージャが持つ命令群は実行されずに、対応する end procedure 命令の次の行にジャンプします。

サンプルプログラム

rem procedure

for i=1 to 10
  call fact i,1,i
next

procedure fact n,v,i
  if n=0 then
    print i;"!=";v
  else
    call fact n-1,v*n,i
  end if
end procedure

print "Done"