● サンプルプログラム - localprm

BASIC 内の変数環境を、ユーザステートメントで切り替えられるようにする方法の一例です(変数環境の切り替えについては 「補足:変数環境の変更」 参照の事)。

プログラムはコンソールアプリケーションで、exe名は test.exe となっています。


環境の切り替えは、次のユーザステートメントで行います。

@local

    書式:

        @local

        @local  変数名1 , 変数名2 , 変数名3 …

新しい変数環境に切り替えます。以前の環境は保持します。
切り替えた変数環境はクリアされた状態になっています。引数に変数名を記述すると、その変数を以前の環境から引き継ぎます。

@endlocal

    書式:

        @endlocal

        @endlocal  変数名1 , 変数名2 , 変数名3 …

現在の環境を破棄し、以前の環境に戻します。
引数に変数名を記述すると、その変数を以前の環境へ引き継ぎます。以前の環境に同名の変数が存在する場合、その変数と置き換わります(コピー元優先)。


使い方

BASIC ソースは testbas.txt に記述してください。

    dim a(3) = (1,2,3)

    @local

        a = 999

        @print a : # 999 表示

    @endlocal

    @print a(0);" ";a(1);" ";a(2) : # 1 2 3  表示

@print はsc_basic と同じ仕様です。

@local と @endlocal は対で使用する必要があります。
@local 〜 @endlocal の範囲は別の変数環境となり、外側の変数は見えなくなります。内部で属性の異なる同名の変数を使用しても問題はありません。

@local 〜 @endlocal は入れ子にする事ができます。

    a = 1

    @local

        a = 2

        @local

            a = 3

            @print a : # 3 表示

        @endlocal

        @print a : # 2 表示

    @endlocal

    @print a : # 1 表示

切り替え可能環境数は 7 です。7 個を超えて @local を実行した場合は -901 を返して中断します。

環境の切り替えは for ループの制御変数にも影響します。次のような構成にはしないでください。

a.

    for i = 0 to 10
        @local
    next

    @endlocal

b.

    @local

    for i = 0 to 10
        @endlocal
    next

これらの場合、for の制御変数が途中から見えなくなってしまうので、STATUS_ILLEGAL_FORLOOP を返して中断します。
for ループ の範囲に別環境がある場合や、別環境中に for ループがある場合は問題ありません。

c.

    for i = 0 to 10
        @local

        @endlocal
    next


d.

    @local

    for i = 0 to 10

    next

    @endlocal


このプログラムでは STRCALC_PARAM 構造体 の配列を使用しており、処理用の環境は空の器として別に存在します。
@local、@endlocal が実行された時に、処理用の環境と配列の内容を入れ替える事で、環境の切り替えを行います。


StrCalc の初期化/解放は、配列に対してまとめて行われます。

  • 初期時の環境は [0] です。

  • 配列の要素数を増やせば、@local 〜 @endlocal の入れ子を深くする事ができますが、使用状況に関わらず、初期化の時間や使用メモリ量が増加します。

  • プログラム終了時は、最後に処理していた環境を配列に戻す必要があります。