当前位置:  开发笔记 > 编程语言 > 正文

什么是"Lambda Lifting"?

如何解决《什么是"LambdaLifting"?》经验,为你挑选了2个好方法。

我在浏览Erlang编译器源时遇到了这个问题.

我不是真的得到它.(去图;)),考虑到我刚刚意识到5分钟前有这样的事情).

请原谅我先问一下,不要先试着理解它存在的原因.

有关于它的维基百科文章,但它非常神秘.



1> Doug Currie..:

Lambda提升用于将闭包转变为纯函数.通过向函数传递额外的参数,可以减少其自由变量的数量.当您将lambda"提升"到更高和更高的范围时,您可以添加参数以容纳在该范围中声明的局部变量(否则将是自由变量).一旦lambda没有自由变量,它就是纯粹的"顶级"函数.

当然,如果您了解所有lambda的呼叫站点,您只能这样做; 换句话说,只有当lambda没有逃脱时.

编译器优化器的好处是可以消除闭包(函数环境).这可能使得在寄存器中传递参数而不是堆栈(或堆)将它们分配为自由变量成为可能.


您需要知道所有呼叫站点的原因是因为您需要通过添加额外参数(在我的JavaScript示例中为x)来更新对该函数的所有调用.
Escapes up意味着闭包比创建环境的时间更长.它可以存储在一个可以逃逸的数据结构中,也可以传递给可以让它逃脱的函数,也可以由创建它的函数返回.因此,环境必须在堆上.
Escapes down意味着它被传递给一个已知的函数,并且该函数不会让它逃脱.因此,闭包的生命周期小于封闭函数的生命周期,因此可以进行堆栈分配.

2> Tom Lokhorst..:

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功能,则必须更新所有这些调用.

推荐阅读
linjiabin43
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有