采用动态范围变量

时间:2010-09-29 15:59:56

标签: dynamic-scope

想象一下,您正在设计自己的编程语言。非常简单的语言,非常特定的目的。它有函数,循环和变量。并且您希望将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 ,或者分配 def 等等。但是“外部范围”会是什么意思?如果'count'没有在循环之前定义但是它早先在调用堆栈的某个地方定义了怎么办? “set count = ...”会从父框架的父级父项的父项中为变量赋值吗?
  • 您是否会在循环语句中引入返回值(或元组),以便可以编写如下内容:

    var count = 0 var count = loop(condition == true)return [i] {var i = i + 1}

这看起来不是很尴尬吗?

  • 您的解决方案?

据我所知,Perl支持使用 local 关键字进行动态范围设定。您将如何使用动态作用域变量

在Perl中实现此类示例

谢谢!

1 个答案:

答案 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