|
|
動的スコープは、[[静的スコープ]](構文構造のみから決定できるスコープ)に加え、実行時の親子関係の子側(呼び出された側)から親側(呼び出し側)のスコープを参照できるスコープである。このとき参照されるのは、親子関係を親側に辿り、より近い[[ブロック (プログラミング)|ブロック]]にある変数である。以下の疑似コードでは:
funcA()A {
var x;
}
funcB()B {
var x,y;
A; // このAはxを参照可
funcA();
}
funcC()C {
var x,zy;
A; // このAはxを参照不可
funcA();
}
* <code>funcB</code>内で見えるのは自己ブロック内の<code>x</code>、<code>y</code>である。
* <code>funcC</code>内で見えるのは自己ブロック内の<code>x</code>、<code>z</code>である。
* <code>funcA</code>を<code>funcB</code>から呼び出したときは自己ブロック内の<code>x</code>と<code>funcB</code>内の<code>y</code>である。
* <code>funcA</code>を<code>funcC</code>から呼び出したときは自己ブロック内の<code>x</code>と<code>funcC</code>内の<code>z</code>である。
このときブロック<code>funcAB</code>内で[[変数 (プから呼び出されたブログラミング)|変数]]ック<code>zA</code>を利用していては、ブロック<code>funcBB</code>(または他ので定義されている変数<code>zx</code>の見えない[[関数 (プを参照できる。ブログラミング)|関数]])ック<code>C</code>から呼び出しされたときブロック<code>A</code>はエラーとな、ブロック<code>B</code>で定義されている変数<code>x</code>は参照できない。
動的スコープの代表的な言語は古典[[LISP]]や[[Emacs Lisp]]、[[LOGO]]、[[Perl]]のlocal変数など。
|