1. 導入:なぜマクロでの「文字リテラル」渡しが重要なのか
メインフレームのPL/I開発において、プリプロセッサ(マクロ)はコードの冗長性を排除する強力なツールです。しかし、引数として「文字リテラル」を渡す際、多くの技術者が「引用符(’)が意図せず消えたり、逆に二重に付いてしまったりする」という壁にぶつかります。この挙動を理解することは、汎用的なマクロライブラリを構築し、保守性の高いコードを実現するために不可欠です。
2. 基礎知識:PL/Iプリプロセッサの展開ルール
PL/Iのプリプロセッサは、コンパイル前のソースコードを文字列として置換・加工する機能です。マクロ呼び出し時に引数として渡された文字列は、そのままマクロ内の変数に格納されます。ここで重要なのは、「引数に含めた引用符は、プリプロセッサにとっては単なる文字の一部として扱われる」という点です。これを正しく理解していないと、マクロ展開後のソースコードに誤った構文が生成され、コンパイルエラーの原因となります。
3. 実装・解決策:エスケープの考え方
マクロ内で文字列リテラルを扱う場合、呼び出し側から「’HELLO’」という引数を受け取った際、マクロ側で「’」を付与しようとすると「”HELLO”」という期待外れの結果になりがちです。解決策は、「マクロ側では純粋な値のみを期待し、呼び出し側でリテラルとして渡す」というルールを徹底するか、あるいはマクロ内で引用符を厳密に制御するロジックを組むことです。
4. サンプルプログラム
以下は、引数を受け取り、PUTステートメントを動的に生成するプリプロセッサのサンプルです。
/ %PROCEDUREの定義 /
%GEN_PUT: PROCEDURE (MSG);
/ MSGの内容をそのままPUT LISTに組み込む /
/ ここで引用符を制御する必要がある場合は、SUBSTR関数などで調整します /
%PUT ‘PUT LIST(‘ || MSG || ‘);’;
%END GEN_PUT;
/ 利用例:プリプロセッサの呼び出し /
%GEN_PUT(”’HELLO”’);
/ 展開後のコード:PUT LIST(‘HELLO’); /
/ 解説: /
/ 呼び出し時の引数 ”’HELLO”’ は、マクロ内には ‘HELLO’ として渡ります。 /
/ 二重引用符をエスケープするために、呼び出し側で3つの引用符を並べています。 /
5. 応用・注意点:移行とデバッグの極意
現場で最も多いトラブルは、既存のメタ言語(JCLや古いプリプロセッサ)から現代の言語環境へコードを移行する際に、この「引用符の剥離ロジック」が食い違うことです。
注意点:
・二重引用符の数に注意: PL/Iでは引用符そのものを表現するために「”」と記述します。マクロ展開を考慮すると、さらに階層が深まるため、デバッグ時には必ず「展開後のソース(LISTオプション等で出力したもの)」を確認してください。
・型安全性の確保: プリプロセッサは文字列置換に過ぎません。引数に不正な文字が含まれていてもチェックが働かないため、マクロ内でのバリデーション(文字数制限や特定文字の禁止)を実装しておくことを強く推奨します。
このTipsを活かし、複雑なビジネスロジックを簡潔なマクロで制御する、堅牢なシステム開発を目指しましょう。

コメント