1

想象一下,您正在设计自己的编程语言。非常简单的语言,用于非常特定的目的。它有函数、循环和变量。并且您想对变量使用动态范围

考虑这个假想的例子:

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 !!!

我的问题是 - 如何使循环内设置的“计数”变量值在外部可见?你会怎么做才能让用户看起来更自然(或不那么混乱)?

  • 除了在当前范围内定义新变量的关键字之外,您是否会引入一个特殊关键字来为外部范围内的现有变量赋值?让我们说setvar,或者assingdef等。但是“外部范围”是什么意思呢?如果 'count' 没有在循环之前定义,而是在调用堆栈的某个位置更早地定义了怎么办?“set count = ...”是否会从父框架的父级的父级为变量分配一个值?
  • 您是否会在循环语句中引入一个返回值(或元组),以便可以编写如下内容:

    var count = 0 var count = 循环(条件 == true)返回 [i] { var i = i + 1 }

会不会显得很尴尬?

  • 你的解决方案?

据了解 Perl 支持使用local关键字的动态范围。您将如何使用动态范围变量在 Perl 中实现这样的示例?

谢谢!

4

1 回答 1

0

听起来你也想吃蛋糕,在这里。在内部范围内声明的一些变量应该在外部范围内“隐藏”相同的变量,而另一些则不应该。

对我来说听起来很容易;如果在内部范围内声明一个变量,其签名(名称和类型)与在外部范围内的相同,编译器应该允许这种“语法糖”并简单地创建一个新变量,该变量实际上由任何中间代码中的某个混搭引用使用(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
于 2010-09-29T16:10:35.250 回答