【入門編】RETURNS属性による関数値の戻り値定義 – PL/Iの基本構文とデータ制御実践ガイド

PL/Iの「RETURNS」を怖がらないで!関数呼び出しの裏側を徹底解剖

こんにちは!メインフレームの世界へようこそ。
普段、JavaやCOBOLを触っている皆さんにとって、PL/Iは少し「古風で威圧的な要塞」のように見えるかもしれませんね。でも大丈夫です。PL/Iは非常に論理的で、一度コツを掴めばこれほど柔軟な言語はないと実感できるはずです。

今回は、PL/Iにおける「関数(FUNCTION)」の要であるRETURNS属性についてお話しします。

1. なぜPL/Iで「関数」を作るのか?

Javaなら`public int calculate()`、COBOLなら`CALL ‘SUBPGM’ USING…`という風に処理を分けますよね。PL/Iでも`PROCEDURE`を使って処理を分割しますが、値を返したい場合は特別な作法が必要です。

PL/Iの`PROCEDURE`には「サブルーチン(戻り値なし)」と「関数(戻り値あり)」の2つの顔があります。値を返したいときは、「このプロシージャは、計算が終わったらこの型のデータを置いていくよ!」という約束を、`RETURNS`キーワードで宣言してあげる必要があるんです。

2. RETURNS属性の書き方とルール

まずは、実用的なコード例を見てみましょう。ここでは「金額を計算して返す」というシンプルな例を挙げます。

1
/ メイン処理部分 /
MAIN_PROC: PROCEDURE OPTIONS(MAIN);

DCL CALC_TAX ENTRY(FIXED BIN(31)) RETURNS(FIXED DEC(15,2));
DCL PRICE FIXED BIN(31) INIT(1000);
DCL TOTAL FIXED DEC(15,2);

/ ここで関数を呼び出し、戻り値を受け取る /
TOTAL = CALC_TAX(PRICE);

PUT SKIP LIST(‘税込金額は: ‘ || TOTAL);
END MAIN_PROC;

/ 税額計算関数 /
CALC_TAX: PROCEDURE(P_PRICE) RETURNS(FIXED DEC(15,2));
DCL P_PRICE FIXED BIN(31) PARAMETER;
DCL TAX_RATE FIXED DEC(3,2) INIT(1.10);

/ RETURN文で値を返す。型が一致していないとコンパイラに怒られます /
RETURN(P_PRICE TAX_RATE);
END CALC_TAX;

ここがポイント!

  • ENTRY宣言の重要性: 呼び出し元(MAIN_PROC)で「CALC_TAXという関数は、引数を1つ取って、固定小数点を返すよ」と教えてあげる必要があります。これを忘れると、コンパイラは「戻り値の型がわからない!」と不安になってしまい、デフォルトの型(FLOAT)で勝手に解釈して悲劇(データ化け)が起きます。
  • RETURNSの定義: `RETURNS(FIXED DEC(15,2))` の部分は、まさに「戻り値の型指定」です。COBOLのPICTURE句に近い感覚でサイズを指定できます。

3. なぜ「暗黙の型変換」には注意が必要なのか?

Javaの経験がある方は、「型が違っても自動でキャストしてくれるでしょ?」と思うかもしれません。PL/Iもそれなりに気を利かせてくれますが、メインフレームの世界では「暗黙の変換」は「バグの温床」です。

例えば、`RETURNS(FIXED DEC(15,2))`と指定したのに、中身で`FLOAT`(浮動小数点)を返すとどうなるか。
PL/Iコンパイラは一生懸命変換しようとしますが、その過程で精度が落ちたり、桁あふれ(オーバーフロー)が起きたりします。

現場の教訓:
> 「型は呼び出し元と呼び出し先で完全に一致させるべし!」

これが、夜中のバッチトラブルを避けるための鉄則です。面倒に感じるかもしれませんが、明示的に型を合わせることで、計算結果の精度を自分自身の手でコントロールできる。これこそがPL/Iの醍醐味なのです。

4. 初学者のための「迷わない」ヒント

最後に、これからPL/Iを触る皆さんに一つだけアドバイスです。

PL/Iのコードを読むときは、「DCL(DECLARE)文を制する者は、PL/Iを制す」と覚えておいてください。どの変数がどんな型で、関数が何を返すのか。その地図さえ手元にあれば、メインフレームの複雑なロジックも、ただのパズルのように見えてくるはずです。

「怖い」と思っていた構文も、一つずつ紐解けば、実はとても親切に設計されていることに気づくはずです。もしコンパイラに叱られても、それは「もっと厳密に書きなさい」という親心だと思って、じっくり向き合ってみてくださいね。

皆さんのメインフレームライフが、実りあるものになりますように!また次の記事でお会いしましょう。

コメント

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