Scheme 编译时间-闭包-方案
你能告诉我闭包的含义是什么,它们是在编译时创建的吗? 比如说,Scheme 编译时间-闭包-方案,scheme,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))
(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))
多谢各位 闭包是两件事:代码和环境。环境本质上是函数词法范围内自由值的向量。当代码执行时,它将从参数中获取一些值,并从环境中获取一些值。例如,在上述带有“if”主体的
lambda中,x的值来自参数,而n
、f
、n的deriv
、deriv
、=
和-
的值来自环境
编译器在编译时生成所有代码,然后在运行时生成将代码与环境配对的闭包
下面是一个简单的例子:
$ (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(x)(lambda(y)(yx)))
;; 地址:
;; 标签:富
;; 常数:
;; 0:t
;; 1:(无代码…)
;; 代码:
;; 0:检查1 0
;; 3:获取loc 0
;; 5:结束1
;; 8:返回1
;; :
;; 地址:
;; 标签:无
;; 常数:
;; 0:t
;; 1: ( 14)
;; 代码:
;; 0:检查1 0
;; 3:获取loc res 0 1
;; 6:获取环境0
;; 8:呼叫tail slow 1
$
这显示函数foo
及其返回的lambda
的字节码。在foo
中有一个字节码closure1
,它获取常量索引1处的代码和堆栈上的1值(值x
)来创建一个闭包,然后返回它。lambda
的代码在堆栈上推送一个本地值(get loc res
),从环境中推送一个值(get env
),然后进行调用((y x)
)。这是在哪里表达的,如何用表达式编辑的?您使用哪个实现输出这些统计数据?我自己的;但是没有,谢谢。哪些lambda是它们的创建时间在编译中的闭包?两者都是闭包。我没有显示用于创建绑定到foo
的闭包的汇编程序输出。foo
的闭包是作为REPL的一部分创建的。如果此答案有用,请“向上投票”;如果您满意,请标记为“已回答”。