想象一下,您正在设计自己的编程语言。非常简单的语言,非常特定的目的。它有函数,循环和变量。并且您希望将dynamic scoping用于变量。
考虑一个虚构的例子:
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 !!!
我的问题是 - 如何让循环内的'count'变量值设置在外面可见? 你会如何做到这一点,以使用户看起来更自然(或更少混淆)?
您是否会在循环语句中引入返回值(或元组),以便可以编写如下内容:
var count = 0 var count = loop(condition == true)return [i] {var i = i + 1}
这看起来不是很尴尬吗?
据我所知,Perl支持使用 local 关键字进行动态范围设定。您将如何使用动态作用域变量 ?
在Perl中实现此类示例谢谢!
答案 0 :(得分:0)
听起来你想要吃蛋糕,在这里吃。在内部范围中声明的一些变量应该“隐藏”外部范围中的相同变量,而其他变量则不应该。
听起来很容易;如果变量在内部作用域中声明,并且在外部作用域中具有相同的签名(名称和类型),则编译器应该允许这个“语法糖”并简单地创建一个新的变量,该变量实际上由某些mashup在任何中间代码中引用使用(MSIL,JIL,汇编)。然后,从count中删除var声明,大多数关于方法内范围的标准将使其完全按照您想要的方式工作。您可以选择在内部变量声明中使用“new”关键字来向编译器确认,是的,您确实需要一个具有“隐藏”外部范围定义的同名变量。因此,您的代码段只会更改如下:
var x = "foo";
var count = 0;
loop (/* condition */) {
var x = "bar"; //"hides" the outer x; maybe require "new" to confirm
print (x); // "bar"
count = count + 1; //works with the outer definition of count
}
print (x); // "foo"
print (count); // > 0