【入門編】プロシージャ間通信における引数の省略(OMITTED) – PL/Iの基本構文とデータ制御実践ガイド

こんにちは。IBMメインフレームの世界へようこそ。
Javaのオブジェクト指向やCOBOLの厳格なデータ定義に慣れ親しんだ皆さんが、PL/Iのコードを初めて目にしたとき、「なんだか少し古めかしくて、独特な書き方をするな」と感じるのは当然のことです。

でも、安心してください。PL/Iは「科学技術計算」から「事務処理」までを一台でこなすために生まれた、非常に柔軟で賢い言語です。今回は、そんなPL/Iの懐の深さが垣間見える「引数の省略(OMITTED)」という、ちょっと大人なテクニックについてお話しします。

引数を「渡さない」という選択肢

JavaやCOBOL(特に古い規格)では、メソッドやサブルーチンを呼ぶときに「引数は全部揃えて渡すのが当たり前」という感覚が強いですよね。しかし、PL/Iでは「今回はこのデータはいらないから、空っぽのまま渡すね」ということが可能です。これが「OMITTED(省略)」です。

なぜ「省略」が必要なのか?

たとえば、ある汎用的な計算プロシージャがあるとしましょう。

  • 基本的には「金額」と「税率」が必要。
  • でも、たまに「税率」は計算済みだから、「金額」だけ渡して処理してほしい。

こんなとき、引数ごとに別のプロシージャを用意するのは面倒ですよね。そこで「引数がない場合は、デフォルト値を使うか、あるいは処理自体をスキップする」というロジックを組むのです。

実践!ADDR関数を使った「不在証明」

PL/Iで引数が省略されたかどうかを判定するには、`ADDR`関数を使います。これは、渡されたデータの「アドレス(メモリ上の番地)」を取得する魔法の関数です。

もし引数が省略されていれば、そのアドレスは「ヌル(NULL)」になります。これを利用して、以下のように判定します。

/i
/ メインプロシージャ /
TEST_PROC: PROC OPTIONS(MAIN);

DCL CALC_TAX ENTRY(FLOAT DEC(15), FLOAT DEC(5) OPTIONAL);
DCL AMOUNT FLOAT DEC(15) INIT(1000);

/ 第2引数を省略して呼び出す /
CALL CALC_TAX(AMOUNT);

RETURN;
END TEST_PROC;

/ 計算用プロシージャ /
CALC_TAX: PROC(P_AMOUNT, P_TAX_RATE) OPTIONS(REENTRANT);
DCL P_AMOUNT FLOAT DEC(15);
DCL P_TAX_RATE FLOAT DEC(5) OPTIONAL; / 省略可能であることを明示 /

/ ADDR関数でメモリ上の存在を確認 /
IF ADDR(P_TAX_RATE) = NULL() THEN DO;
PUT SKIP LIST(‘税率は省略されました。デフォルトの5%を使用します。’);
END;
ELSE DO;
PUT SKIP LIST(‘税率が渡されました。計算を開始します。’);
END;

RETURN;
END CALC_TAX;

コードのポイントを解説しますね

1. `OPTIONAL`属性: プロシージャの引数宣言にこれを付けることで、「この引数は渡されなくても怒らないでね」とコンパイラに伝えます。これを書かないと、呼び出し元で省略したときにコンパイラが「引数が足りないよ!」と警告を出してきます。
2. `ADDR(P_TAX_RATE)`: 変数のアドレスを見に行きます。もし呼び出し元が値を渡していなければ、ここにはシステムから「何もありませんよ(NULL)」というサインが返ってくる仕組みです。
3. `NULL()`: これが比較対象です。Javaの `null` と同じ感覚で使えます。

初学者が躓きやすいポイント:ここだけは注意!

メインフレームの現場で、このコードを扱うときに一つだけ気をつけてほしいことがあります。

それは、「省略された引数に対して、いきなり値を代入したり参照したりしないこと」です。もし`IF`文でチェックせずに `P_TAX_RATE = 0.08;` なんて書いてしまうと、存在しないメモリ領域を操作しようとして、メインフレーム界隈ではお馴染みの「アベンド(ABEND:異常終了)」を起こしてしまいます。

最後に:怖がらなくて大丈夫です

PL/Iのポインタ操作やアドレスチェックは、現代の言語に慣れた方からすると少し生々しく感じるかもしれません。でも、これはシステムがメモリをどのように管理しているかを知る、とても貴重な経験になります。

「引数がないなら、ないなりの対応をする」。この柔軟性こそが、何十年も動き続ける基幹システムを支えてきたPL/Iの強みです。

もし現場で「ADDRって何だっけ?」と迷ったら、いつでもここに戻ってきてくださいね。一つひとつ、紐解いていけば必ず理解できますから。応援しています!

タイトルとURLをコピーしました