私が間違っている場合は修正してください。ただし、JMP にはスコープ永続性のない動的スコープがあるようです (擬似名前空間を除く)ここ、地元、窓、箱)。これは、参照カウンタを使用して完全なスコープの永続性を備えた字句スコープを備えた多くの一般的なプログラミング言語とは対照的です。
これは、JMP の奇妙なスコープ システムを操作するのに必要な直観を得るまで、私にとって非常に頭を悩ませることになりました。これは多くの人にとって大きな混乱点であると思います。動的スコープを使用するプログラミング言語はそれほど多くありません (LISP は重要な例外であり、JSL は LISP といくつかの類似点があります)。
JSL ドキュメント チームには、この違いを指摘し、動的スコープをよりよく理解する方法に関するリソースやリンクを提供することをお勧めします。これは、名前解決を行う標準的な方法ではないためです。
以下に例を示します。外部関数のローカル スコープは return ステートメントの直後にクリアされ、内部関数の名前解決は動的です (現在の呼び出しスタックに基づいて)。
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
//:*/
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Expr( inner function ) );
);
func = outer function;
func()
/*:
7スコープ永続性を備えた字句スコープの言語 (Python など) で機能的に同等のことを行う場合、内部関数の囲みスコープは永続的で (外部関数のローカル スコープです)、内部関数の名前解決は永続的になります。関数の x 変数は、システムの字句読み取りからの値 4 です。JMP は字句スコープを使用せず、動的スコープを使用するため、スクリプトの最後で内部関数が最終的に実行されるときに、ローカル -> ここ -> グローバル (および場合によっては列) の動的名前解決を使用します。現在のテーブルの名前) を調べ、値 7 を見つけます。
このタイプの動作を理解することは、JSL で堅牢なプログラムを構築するために重要です。JSL を学習している/苦労している人にはこの点を指摘しておきたいと思います。
何か考えや直感的ではない例があれば教えてください。