Lambda表达式和DEP一起工作吗?

时间:2016-06-12 10:21:48

标签: lambda functional-programming scheme closures dep

我正在尝试了解动态分配的代码如何与dep一起运行。

让我们以编译的Scheme程序为例。 据我了解, 当评估lambda表达式的时候,运行时HAS分配内存以存储代码(实际上存储一个也有代码的闭包)。 由于它无法事先知道代码的大小,因此必须是动态的。所以,它必须使用堆。

为什么尝试从堆中执行此代码时DEP机制没有运行时异常?

更一般地说,当DEP到处时,整个“代码是数据和数据是代码”的想法是如何工作的?

2 个答案:

答案 0 :(得分:1)

Lambda表达式,或者更通用的"由其他函数生成和返回的函数",似乎需要动态代码生成,但它们不会:相反,这些函数通常由数据表示结构称为功能闭包

函数闭包是一对

  • 指向(静态编译)函数的指针,
  • 自由变量的值,即在函数外定义的变量。

例如,请考虑以下类似JavaScript的代码:

    function make_adder(x) {
      function adder(y) {
        return x + y;
      }
      return adder;
      // equivalent to "return function(y) { return x + y; };"
    }

    var add42 = make_adder(42);
    add42(3); // 45

当使用参数make_adder调用42时,其实现返回一个闭包<adder, 42>,它是函数{{(指针)的。 1}} 整数adder。当此闭包应用于42时,除了可见参数3之外,函数部分还应用于其自由变量42的值x

从概念上讲,您可以认为上面的代码实现如下:

3

在Scheme中,第一个代码是

    function make_adder(x) {
      function adder(x, y) {
        return x + y;
      }
      return { func : adder, free : x };
    }

    var add42 = make_adder(42);
    add42.func(add42.free, 3); // 45

,第二个是:

    (define (make_adder x)
      (lambda (y) (+ x y)))
    (define add42 (make_adder 42))
    (add42 3) ; 45

有关详细信息,请参阅:https://en.wikipedia.org/wiki/Closure_(computer_programming)

答案 1 :(得分:0)

不,返回lambda不需要内存代码,只需要数据/参数。考虑闭包是OOP中的普通对象,创建是作为&#34; new&#34;在Java中,c#...