独自のプログラミング言語を設計していると想像してください。非常に特定の目的のための非常に単純な言語。関数、ループ、変数があります。また、変数の動的スコープを利用したいと考えています。
架空の例を考えてみましょう:
var x = "foo"
var count = 0
loop (/* condition */) {
var x = "bar"
// A new stack frame is created for 'x',
// so inside the loop (and any subsequent function calls) it is bound to "bar",
// but outside the loop 'x' is still bound to "foo"
print (x) // output is "bar"
var count = count + 1
}
print (x) // output is "foo"
print (count) // desired output is something above zero, but it's not !!!
私の質問は - ループ内に設定された「カウント」変数値を外部に表示する方法は? ユーザーにとってより自然な (または混乱を避ける) ようにするには、どうすればよいでしょうか?
- 現在のスコープで新しい変数を定義するためのキーワードに加えて、外側のスコープから既存の変数に値を割り当てるための特別なキーワードを導入しますか? setとvar、またはassingとdefなどとしましょう。しかし、「外側のスコープ」とは何を意味するのでしょうか? 「count」がループの直前に定義されておらず、代わりに呼び出しスタックのどこかで定義されている場合はどうなりますか? 「set count = ...」は、親フレームの親の親から変数に値を割り当てますか?
次のような記述ができるように、ループ文に戻り値 (またはタプル) を導入しますか?
変数カウント = 0 変数カウント = ループ (条件 == 真) は [i] { 変数 i = i + 1 } を返します。
それは厄介に見えませんか?
- あなたの解決策は?
知る限り、Perl はlocalキーワードを使用した動的スコープをサポートしています。動的スコープ変数のみを使用して、Perl でこのような例をどのように実装しますか?
ありがとうございました!