CL

180. CLPでローカル変数を定義できるか?

まず次の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名がローカルとして認められていることを覚えていて欲しい。