これまでに示したマクロ変数参照は、1つのアンパサンドで始まる直接的なマクロ変数参照(&name)でした。一方、一連のマクロ変数に属するマクロ変数を間接的に参照できるということも、役に立ちます。これによって、マクロ変数参照が置換されるときに、その名前を決定できます。マクロ機能として、間接的なマクロ変数参照が提供されています。この機能によって、式(たとえば、CITY&N)を使用して一連のマクロ変数のうちの1つへの参照を生成できます。たとえば、マクロ変数Nの値を使用して、CITY1からCITY20までの名前を持つ一連のマクロ変数のうちの1つを参照できます。Nの値が8の場合、CITY8への参照になります。Nの値が3の場合、CITY3への参照になります。
この例の場合、必要な参照のタイプはCITY&Nですが、次の例は、CITYに&Nを加えた値を生成しません。
%put &city&n; /* incorrect */
このコードは、マクロ変数CITYが存在しないことを示す警告メッセージを生成します。これは、マクロ機能が&CITYを置換してから&Nを置換し、それらの値を連結しようとするためです。
間接的なマクロ変数参照を使用する場合、マクロプロセッサに対して、強制的に2回以上マクロ変数参照をスキャンさせます。このプロセスでは2回目以降のスキャンで目的の参照を置換します。マクロプロセッサに強制的にマクロ変数参照を再スキャンさせるには、マクロ変数参照で2つ以上のアンパサンドを使用します。マクロプロセッサが複数のアンパサンドを検出した場合に行う基本的なアクションは、2つのアンパサンドを1つのアンパサンドに置換することです。たとえば、&Nの値をCITYに追加して該当する変数名を参照する場合、次のように実行します。
%put &&city&n; /* correct */
Nの値が6の場合、マクロプロセッサがこのステートメントを受け取ると、次のステップが実行されます。
-
-
-
-
マクロ変数参照(&CITY6)の先頭に戻り、最初から置換を再開し、CITY6の値を出力します。