レキシカルスコープの簡単な紹介は何ですか?
ベストアンサー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
アクセスできます。x
dummy1
dummy2
x
fun
x
dummy1();
5を印刷します。
dummy2();
10 を出力します。
最初のものはコンパイル時に推測できるため静的と呼ばれ、2 番目は外側のスコープが動的で関数のチェーン呼び出しに依存するため動的と呼ばれます。
静的スコープの方が目に優しいと思います。ほとんどの言語は最終的にこの方向へ進みました。Lisp も例外ではありません (両方できるはずですよね?)。動的スコープは、呼び出された関数にすべての変数の参照を渡すようなものです。
コンパイラが関数の外部動的スコープを推測できない理由の例として、最後の例を考えてみましょう。次のように記述するとします。
if(/* some condition */)
dummy1();
else
dummy2();
呼び出しチェーンは実行時の条件に依存します。それが真の場合、呼び出しチェーンは次のようになります。
dummy1 --> fun()
条件が偽の場合:
dummy2 --> fun()
どちらの場合も、の外側のスコープはfun
、呼び出し元と呼び出し元の呼び出し元の合計、などとなります。
C 言語ではネストされた関数や動的スコープは許可されないことに注意してください。