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