まず次のCLPソースを見て欲しい。
[CLP: TESTTAG ]
ソースはこちらから
0001.00 PGM 0002.00 /*----------------------------------------------------------------------*/ 0003.00 /* TESTTAG サブ・ルーチン TAG の検査 */ 0004.00 /* */ 0005.00 /* 作成 : 2026/01/08 */ 0006.00 /*----------------------------------------------------------------------*/ 0007.00 DCL VAR(&N) TYPE(*DEC) LEN(5 0) 0008.00 /*---------------------------*/ 0009.00 CALLSUBR SUBR(SUBR001) 0010.00 /*---------------------------*/ 0011.00 /*---------------------------*/ 0012.00 CALLSUBR SUBR(SUBR002) 0013.00 /*---------------------------*/ 0014.00 /*---------------------------*/ 0015.00 CALLSUBR SUBR(SUBR003) 0016.00 /*---------------------------*/ 0017.00 RETURN 0018.00 /******************************/ 0019.00 SUBR SUBR(SUBR001) 0020.00 /******************************/ 0021.00 CHGVAR VAR(&N) VALUE(1) 0022.00 LOOP1: 0023.00 IF COND(&N < 10) THEN(DO) 0024.00 CHGVAR VAR(&N) VALUE(&N + 1) 0025.00 GOTO LOOP1 0026.00 ENDDO 0027.00 RTNSUBR 0028.00 ENDSUBR 0029.00 /******************************/ 0030.00 SUBR SUBR(SUBR002) 0031.00 /******************************/ 0032.00 CHGVAR VAR(&N) VALUE(1) 0033.00 LOOP1: 0034.00 IF COND(&N < 10) THEN(DO) 0035.00 CHGVAR VAR(&N) VALUE(&N + 1) 0036.00 GOTO LOOP1 0037.00 ENDDO 0038.00 RTNSUBR 0039.00 ENDSUBR 0040.00 /******************************/ 0041.00 SUBR SUBR(SUBR003) 0042.00 /******************************/ 0043.00 CHGVAR VAR(&N) VALUE(1) 0044.00 LOOP1: 0045.00 IF COND(&N < 10) THEN(DO) 0046.00 CHGVAR VAR(&N) VALUE(&N + 1) 0047.00 GOTO LOOP1 0048.00 ENDDO 0049.00 RTNSUBR 0050.00 ENDSUBR 0051.00 ENDPGM
[コンパイル]
CRTCLPGM PGM(OBJLIB/TESTTAG) SRCFILE(SRCLIB/QCLSRC) OPTION(*SRCDBG) AUT(*ALL)
[解説]
このCLPでは3つのサブ・ルーチン SUBR01, SUBR02 と SUBR03 を
呼び出して実行している。
各々のサブルーチンの中では
変数 &N を 1~10までLOOPして計算している。
このとき各サブルーチンの中で宣言されているTAGは LOOP1 という全く同じ名前の
TAGが宣言されている。
しかしこれはTAG名は既に宣言済みであるというコンパイル・エラーに
なりそうなものであるがコンパイル・エラーにはならない。
つまり LOOP1というTAGはローカルとして定義されていることになる。
それではCLPの中でもローカル変数が定義できるのかと
0029.00 /******************************/ 0030.00 SUBR SUBR(SUBR002) 0031.00 /******************************/ 0032.00 DCL VAR(&N) TYPE(*DEC) LEN(5 0)
と定義してみたがこれはやはりコンパイル・エラーとなってしまって
ローカル変数は認められなかった。
CLPでもローカル変数とグローバル変数と区別して定義できるように
なるとCLPと言えどもかなり立派な開発言語になると思うが
あくまでも制御言語なので今のところそこまではできないようである。
しかしTAG名がローカルとして認められていることを覚えていて欲しい。
