dee*_*lue 38 compiler-construction functional-programming
我在浏览Erlang编译器源时遇到了这个问题.
我不是真的得到它.(去图;)),考虑到我刚刚意识到5分钟前有这样的事情).
请原谅我先问一下,不要先试着理解它存在的原因.
有关于它的维基百科文章,但它非常神秘.
Dou*_*rie 49
Lambda提升用于将闭包转变为纯函数.通过向函数传递额外的参数,可以减少其自由变量的数量.当您将lambda"提升"到更高和更高的范围时,您可以添加参数以容纳在该范围中声明的局部变量(否则将是自由变量).一旦lambda没有自由变量,它就是纯粹的"顶级"函数.
当然,如果您了解所有lambda的呼叫站点,您只能这样做; 换句话说,只有当lambda没有逃脱时.
编译器优化器的好处是可以消除闭包(函数环境).这可能使得在寄存器中传递参数而不是堆栈(或堆)将它们分配为自由变量成为可能.
Tom*_*rst 39
Lambda提升是一种将lambdas提升到更高水平(大多数是顶级)的技术.
Doug Currie描述了为什么要这样做.
以下是一些示例代码(在JavaScript中),您可以手动执行此操作:
function addFive(nr)
{
var x = 5;
function addX(y)
{
return x + y;
}
return addX(nr);
}
Run Code Online (Sandbox Code Playgroud)
现在如果你不想在你addX的定义中使用这个函数addFive你可以将它"提升"到顶层,如下所示:
function addX(y)
{
return x + y;
}
function addFive(nr)
{
var x = 5;
return addX(nr);
}
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用,因为x变量在addX函数的上下文中不再可用.解决这个问题的方法是在函数中添加一个额外的形式参数:
function addX(y, x)
{
return x + y;
}
function addFive(nr)
{
var x = 5;
return addX(nr, x);
}
Run Code Online (Sandbox Code Playgroud)
另外:这是一个非常人为的例子,一个lambda"逃避".你不能像我描述的那样轻松地完成lambda提升.
function getAddFiveFunc()
{
var x = 5;
function addX(y)
{
return x + y;
}
return addX;
}
Run Code Online (Sandbox Code Playgroud)
现在,如果有人调用该getAddFiveFunc函数,他们将获得一个函数.此功能可用于各种场所.现在,如果您想要解除此addX功能,则必须更新所有这些调用.