REXXでポインター??

必要があってREXXのプログラムを書くことになったのですが、アセンブラーでは当たり前のように使えるアドレス・ポインターが使えない。同じ構造のデータ・テーブルが複数あって、それを探索するサブルーチンを作りたい。アセンブラーだと探索するテーブルのアドレスをサブルーチンに渡せば事足りるけど、REXXのようにアドレスを扱わない言語だとそれができない。テーブルには名前があるのでそれを引数で渡せばとも思ったが、それはテーブルの場所(先頭アドレス)が渡るのではなく名前そのものが引数になってしまい上手く行かない。同じ処理を行うサブルーチンを、それぞれのテーブル用に名前を変えて何個も作れば簡単なのだが、本当にみんなそんなことをしているのかと疑問に思った。
ネットを探しまくり、value関数の使い方で実現できることがわかった。備忘録代わりに残しておきます。変数エリアの場所を示すアドレスを間接的に使って値を取り出す方法とも言えます。
プログラムは複数のデータ・テーブルを持つ。各テーブルはデータは違うが構造は同じ。入力されたパラメーターが正しいか(テーブルに登録されているか)を調べるサブルーチンを作りたい。チェックしたい値(キー)と、どのテーブルを探すかをサブルーチンに渡し、サブルーチンそのものは1つで各テーブル共用に作りたい。そういう場合にサブルーチンでは渡されたテーブル名を、名前の文字列そのものではなくテーブルの場所を示す引数として処理したい。そういう場合に参考にできます。C言語でいうポインターとは違うけど、引数をポインターっぽく処理する例かな。

TableSearchというサブルーチンは2つの引数を持つ。1つは探したいキーの値(例えば入力されたパラメーター値など)、もう1つが探す対象となるテーブル名。value関数を入れ子で使うと、テーブル名に添え字を付けてテーブル内の値を取り出せるようである。REXXは専門ではないので細かいことは追求してないけど、こういう発想って感心します。変数の値を参照するのはいちいちvalue関数使わなくてもできるし、いつ使うんでしょ、とも思うが、それを重ねて使うとこうなるとは。
エントリーを探すループの中に「SAY value(ts_table) i value(value(ts_table).i);」を入れてみるとvalue関数の動きがわかりやすい。これで次のようにテーブル名を直接プログラムの中に書いたサブルーチンをテーブル毎に書くようなことをしなくても済みます。

Print Friendly, PDF & Email