问题描述
(注意:这是 my question about closures over goto labels 的伴侣。我相信这个问题的答案将有助于解决另一个问题。)
在 C 中,goto
语句超越作用域是完全合法的,如 this question 所示:
int cond(void);
void use(int);
void foo()
{
{
int y;
label:
y = 2;
use(y);
}
{
int z = 3;
use(z);
/* jump to sibling scope: */ if(cond()) goto label;
}
/* jump to inner scope: */ if(cond()) goto label;
}
相比之下,Algol 60 或 Algol 68 以及可能在其他语言中不允许这样的代码。 (阿尔戈勒 60 allows jumps into compound statements,but not into blocks。)
这样的跳转应该如何实现?在我的语言中,进入一个块会创建一个新的堆栈框架;将块激活和过程调用一视同仁是很方便的,因为块也返回一个值,就像 Algol 68 中的闭子句或 Common Lisp 的 progn
。因此,传输到块需要为当前层和传输目标之间的任何层级创建帧。另一方面,转移到外部作用域很简单,只需要将堆栈展开到某个级别。 (当然,同一范围内的转移是微不足道的。)
假设我们正在为传统的基于堆栈的虚拟机生成字节码。
这是一个例子:
begin
integer x,p;
p := 10;
x := 20;
go to label;
begin
integer y;
y := begin
integer q;
label:
q := x + 2;
p + q;
end;
end;
end;
这应该将 p + q
(即 32)分配给 x
。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)