编译时间 - 关闭 - 方案

时间:2014-05-14 06:54:58

标签: scheme

请告诉我,在编译时创建它们的闭包是什么意思? 例如,

(define nth-deriv
  (lambda(f n)
     (lambda (x)
          (if (= n 0) (f x) ( (nth-deriv (deriv f) (- n 1)) x))
))

(define deriv
   (lambda(f)
      (lambda(x)
         (/ (- (f (+ x dx))
                     (f x))
                 dx))))

我知道在定义时间内,每个函数中的第一个lambda被计算(闭包)。编译时间怎么样? 表达式:

(define five-exp(lambda(x)(* x x x x x)))
(define fourth-deriv-of-five-exp (nth-deriv five-exp 4))

非常感谢!

1 个答案:

答案 0 :(得分:0)

闭包是两件事:代码和环境。环境本质上是一个值的向量,在函数的词法范围内是自由的。代码执行时,它将从参数和环境中的某些值中获取一些值。例如,在上面的lambda with 'if' body中,x的值来自nfnth-derivderiv,{{1}的参数和值}}和=来自环境。

编译器在编译时生成所有代码,然后在运行时生成闭包,将代码与环境配对。

这是一个简单的例子:

-

这显示了函数$ (define foo (lambda (x) (lambda (y) (y x)))) ;; Address : <unknown> ;; Label : foo ;; Constants: ;; 0: #t ;; 1: (code none ...) ;; Code : ;; 0: check 1 0 ;; 3: get-loc 0 ;; 5: closure 1 1 ;; 8: return 1 ;; : ;; Address : <unknown> ;; Label : none ;; Constants: ;; 0: #t ;; 1: (<function> 14) ;; Code : ;; 0: check 1 0 ;; 3: get-loc-res 0 1 ;; 6: get-env 0 ;; 8: call-tail-slow 1 $ 的字节代码及其返回的foo。在lambda中,有一个foo的字节代码,它将常量索引1处的代码和堆栈上的1个值(closure 1 1的值)创建一个闭包,然后返回它。 x的代码在堆栈上推送本地值(lambda),从环境中推送一个值(get-loc-res),然后进行调用(get-env)。