想象一下,您正在设计自己的编程语言。非常简单的语言,用于非常特定的目的。它有函数、循环和变量。并且您想对变量使用动态范围。
考虑这个假想的例子:
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 = ...”是否会从父框架的父级的父级为变量分配一个值?
您是否会在循环语句中引入一个返回值(或元组),以便可以编写如下内容:
var count = 0 var count = 循环(条件 == true)返回 [i] { var i = i + 1 }
会不会显得很尴尬?
- 你的解决方案?
据了解 Perl 支持使用local关键字的动态范围。您将如何仅使用动态范围变量在 Perl 中实现这样的示例?
谢谢!