レキシカルスコープとは何ですか? 質問する

レキシカルスコープとは何ですか? 質問する

レキシカルスコープの簡単な紹介は何ですか?

ベストアンサー1

例を通して理解できました。:)

まず、C のような構文でのレキシカル スコープ(静的スコープとも呼ばれます) です。

void fun()
{
    int x = 5;

    void fun2()
    {
        printf("%d", x);
    }
}

すべての内部レベルは外部レベルにアクセスできます。

もう一つの方法があり、動的スコープと呼ばれ、最初の実装で使用されました。舌足らずの発音これも C のような構文で記述します。

void fun()
{
    printf("%d", x);
}

void dummy1()
{
    int x = 5;

    fun();
}

void dummy2()
{
    int x = 10;

    fun();
}

ここでは、または、あるいはで宣言されてを呼び出す任意の関数のいずれかにfunアクセスできます。xdummy1dummy2xfunx

dummy1();

5を印刷します。

dummy2();

10 を出力します。

最初のものはコンパイル時に推測できるため静的と呼ばれ、2 番目は外側のスコープが動的で関数のチェーン呼び出しに依存するため動的と呼ばれます。

静的スコープの方が目に優しいと思います。ほとんどの言語は最終的にこの方向へ進みました。Lisp も例外ではありません (両方できるはずですよね?)。動的スコープは、呼び出された関数にすべての変数の参照を渡すようなものです。

コンパイラが関数の外部動的スコープを推測できない理由の例として、最後の例を考えてみましょう。次のように記述するとします。

if(/* some condition */)
    dummy1();
else
    dummy2();

呼び出しチェーンは実行時の条件に依存します。それが真の場合、呼び出しチェーンは次のようになります。

dummy1 --> fun()

条件が偽の場合:

dummy2 --> fun()

どちらの場合も、の外側のスコープはfun、呼び出し元と呼び出し元の呼び出し元の合計、などとなります。

C 言語ではネストされた関数や動的スコープは許可されないことに注意してください。

おすすめ記事