我对实现自己的语言翻译感兴趣。根据Sebesta的“编程语言概念”第10章,当编程语言允许这样的嵌套函数时,新的ARI(活动记录实例)充满了静态父级;
f(){
int x;
g() { int y = x+1; ..} // definition of g
k(t) { // definition of k
h(t) { t();..} // definition of h... it calls g() via t()
h(t); // this will call g();
}
k(g); // this will call h() with g
}
在这个简单的示例中,当调用g时,会创建一个新的ARI for g,并且此ARI的静态链接将使用先前存在于运行时堆栈中的f的ARI。
但是我很难清楚地了解如何“在运行时”确定ARI的静态父级。最简单的方法是在整个运行时堆栈中搜索,直到我们找到静态父级的现有ARI,但他们说这不是一种有效的方法。所以我想尝试更好的选择,即“沿着来电者的静态祖先进行导航”。 (书中说我们可以通过跟随调用者静态链接的静态链接来实现这一点。)
在上面的示例中,当通过t()从h()调用g()时,我们首先转到调用者h()的静态父级ARI,然后再转到该ARI的静态父级,依此类推,直到我们遇到f()的ARI。因此,在这个例子中,我们将遵循h-k-f的ARI链。 (我们会遵循更长的ARI链接链进行更深层的嵌套。)
所以我的问题是;
感谢您的帮助。
答案 0 :(得分:1)
以下是您的代码到Lua的翻译:
function f()
local x = 0
local function g ()
local y = x+1
-- etc
end
local function k (t)
local function h (t)
t()
-- etc.
end
h(t)
end
k(g)
end
这是另一个返回值的版本,因此我们可以证明它运行:
function f()
local x = 0
local function g ()
local y = x+1
return y
end
local function k (t)
local function h (t)
return t()
end
return h(t)
end
return k(g)
end
和测试:
> =f()
1
>
见Roberto Ierusalimschy的The Implementation of Lua 5.0,Luiz Henrique de Figueiredo和Waldemar Celes,特别是第5部分,函数和闭包。
您可以看到版本5.1.4的Lua annotated source code或canonical source code for Lua 5.3.x。