LOCAL文

十進BASICでは,規格外命令のLOCAL文を用いて内部手続きに局所変数を宣言するができます。
Full BASICの急所(関数と副プログラム)で,不定方程式a x + b y = c の整数解を探すプログラムとして正しく動作しない例として提示した

100 INPUT a,b,c
110 WHEN EXCEPTION IN
120    CALL solve(a,x,b,y,c)
130    PRINT x,y
140 USE
150    PRINT "解なし"
160 END WHEN
170 SUB solve(a,x,b,y,c)
180    IF b=0 THEN
190       IF MOD(c,a)=0 THEN
200          LET x=c/a
210          LET y=0
220       ELSE
230          LET x=1/0           ! 例外を発生させる
240       END IF
250    ELSE
260       LET q=INT(a/b)
270       LET r=MOD(a,b)
280       CALL solve(b,u,r,v,c)
290       LET x=v
300       LET y=u-q*v
310    END IF
320 END SUB 

は,副プログラム内で用いられているすべての変数を

175    LOCAL q,r,u,v

で局所変数として宣言することで正しく動作させることができます。

なお,rは280行以降現れないので局所変数にする必要がないように見えますが,280行は各変数を参照渡ししているので,rを局所変数にしないと,再帰呼び出し中,rとbが同じ変数を指すことになってしまい,正しく動作しません。
ただし,280行を CALL solve(b,u,(r),v,c)と変えてrを値渡しにすれば,rをLOCAL文の宣言から除いても正しく動作します。
Note.
LOCAL文を使う場合は,

90 DECLARE NUMERIC a,b,c,x,y

のように使用するすべての変数を宣言し,オプション―文法 メニューで「変数宣言を強要する」状態でプログラムを作成することを強く推奨します。

LOCAL文の除去

Full BASIC規格にはLocal文がありませんが,単純変数のみであれば,局所化したい変数をすべて手続きの仮引数に加え,呼び出すときには適宜の定数を入れて(つまり値引数にして)呼び出すように修正すると,Local文を除去できます。
たとえば,上のプログラムの場合,170行と120行,280行を

120    CALL solve(a,x,b,y,c,0,0,0,0)
170 SUB solve(a,x,b,y,c,q,r,u,v)
280       CALL solve(b,u,r,v,c,0,0,0,0)

と変えれば,正しく動作します。
(ただし,分かりにくくなるので,規格合致とすることが目的である場合以外は避けたほうがいいでしょう)


戻る inserted by FC2 system