十進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
のように使用するすべての変数を宣言し,オプション―文法 メニューで「変数宣言を強要する」状態でプログラムを作成することを強く推奨します。
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)
と変えれば,正しく動作します。
(ただし,分かりにくくなるので,規格合致とすることが目的である場合以外は避けたほうがいいでしょう)