【2008/10/28 original author TAKAO】
どんな言語も「構造化プログラミング」を考慮していることは、論を待たないと思います。(構造化プログラミングがわからない人は、Wikipediaをみてください。)プログラミング言語は、それ以外に特有の概念が実装されていることで特色を出しています。その概念を理解することが、その言語らしいプログラミングをするために、不可欠です。REXXの場合、それはスタックと連想配列だと思います。
スタック
スタックそのものは別にREXX固有の話ではなく一般的にデータを扱う時に話題になる概念です。図のように2つの考え方があります。ひとつは地面に土管が埋まっていると思いましょう。そこにデータ(肉でもいい)を投げ込みます。次にそれを取り出すと、もっとも最近投げ込んだデータ(新しい肉)が取り出されますね。(まぜちゃいけません)こういうスタックをLast In – Fast Out(LIFO)という呼び方をします。REXXではPUSHというコマンドでスタックにデータを投げ込み、PULLというコマンドでデータを取り出します。
もうひとつのスタックの考え方は、広場に土管がころがっていると思いましょう。そこにデータ(肉でもいい)を押し込みます。土管の反対側からデータを取り出すと、もっとも昔に押し込んだデータ(古い肉)が取り出されますね。こういうスタックをFast In – Fast Out(FIFO)という呼び方をします。REXXでは、QUEUEというコマンドでスタックにデータを押し込み、取り出し方は同じようにPULLです。
スタックという土管にどの順番でデータを押し込むかは、PULL、QUEUEコマンドで決まり、PULLでひたすらデータを取り出す、というのがREXXの考え方です。
もう一点、スタックで重要な話があります。もし、スタックが空なのにPULLコマンドを出したらどうなるのでしょうか?ゼロが帰る?いやいや、これはREXXプログラムの動作環境で異なります。たとえば、z/OSならばSYSTSINにデータがあれば読み込みますが、それもなければ端末入力待ちになるのです。これにより、プログラムはユーザーからの入力を待つことができるようになるのです。
連想配列
Perl、PHP、VBなどのスクリプト言語ではよく使われていますが、なじみがない方のために連想配列の簡単な説明をしておきます。連想配列とは、添え字が文字列でかまわない配列をいいます。ハッシュといったりもします(個人的には違和感があるけど)。REXXの場合、変数に.が現れると配列だとみなします。
たとえば、
var.1 = "あ"
var.2 = "い"
i = 2
say var.i
では、”い”が表示されます。
添え字が文字列でかまわない以上、次のような配列も許されます。
a = "a" /* 明示的に */
var.a = "あ"
b = "a"
say var.a
“あ” が示されます。
ただし、REXXでは、他言語のように配列の添え字なしで要素を拾い出す(foreach)のような命令がないので、配列の要素を順々に取り出したい場合は、数値の添え字を使います。添え字なしで要素を順次取り出すことのほうが多いでしょうが、そういう場合には、スタックの使用が推奨されているのです。
【2008/10/28 original author TAKAO】