请告诉我,在编译时创建它们的闭包是什么意思? 例如,
(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))
非常感谢!
答案 0 :(得分:0)
闭包是两件事:代码和环境。环境本质上是一个值的向量,在函数的词法范围内是自由的。代码执行时,它将从参数和环境中的某些值中获取一些值。例如,在上面的lambda with 'if' body
中,x的值来自n
,f
,nth-deriv
,deriv
,{{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
)。