現在実行中のマクロのネストレベルを取得するには、%SYSMEXECDEPTH関数を使用します。この関数は、ネストされたマクロ呼び出しにおける指定のマクロのネストの深さを表す数字を返します。%SYSMEXECDEPTH関数は次の値を返します。
詳細については、次に示す例を参照してください。
8 %macro A;
9 %put %sysmexecdepth;
10 %mend A; /* The macro execution depth
of a macro called from open code */
11 %A; /* is one */
1
12
13 %macro B;
14 %put %nrstr(%%)sysmexecdepth=%sysmexecdepth;
15 %put %nrstr(%%)sysmexecname(1)=%sysmexecname(1);
16 %put %nrstr(%%)sysmexecname(2)=%sysmexecname(2);
17 %put %nrstr(%%)sysmexecname(0)=%sysmexecname(0);
18 %put %nrstr(%%)sysmexecname(%nrstr(%%)sysmexecdepth-1)=
%sysmexecname(%sysmexecdepth-1);
19 %mend B;
20
21 %macro C;
22 %B;
23 %mend;
24 %C;
%sysmexecdepth=2
%sysmexecname(1)=C
%sysmexecname(2)=B
%sysmexecname(0)=OPEN CODE
%sysmexecname(%sysmexecdepth-1)=C
25
26 %macro level1;
27 %level2;
28 %mend;
29 %macro level2;
30 %level3;
31 %mend;
32 %macro level3;
33 %level4;
34 %mend;
35 %macro level4;
36 %do i = %sysmexecdepth+1 %to -1 %by -1;
37 %put %nrstr(%%)sysmexecname(&i)=%sysmexecname(&i);
38 %end;
39 %mend;
40
41 %level1;
WARNING: Argument 1 to %SYSMEXECNAME function is out of range.
%sysmexecname(5)=
%sysmexecname(4)=LEVEL4
%sysmexecname(3)=LEVEL3
%sysmexecname(2)=LEVEL2
%sysmexecname(1)=LEVEL1
%sysmexecname(0)=OPEN CODE
WARNING: Argument 1 to %SYSMEXECNAME function is out of range.
%sysmexecname(-1)=
42
-
マクロA
はマクロB
を呼び出します。マクロC
はマクロB
を呼び出します。マクロC
内に配置された%SYSMEXECDEPTH関数の呼び出しは、値2をマクロB
に対して返します。
-
マクロC
>で、同マクロを呼び出したマクロ名を知りたい場合、%SYSMEXECNAME関数を%SYSMEXECNAME(%SYSMEXECDEPTH-1)として呼び出します。
(%SYSMEXECNAME関数の引数であるnの値は、元のネストレベルの値である%SYSMEXECDEPTHの戻り値から1を引いた値になります)。この%SYSMEXECNAME関数の呼び出しは、値Bを返します。