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的一部分创建的。如果此答案有用,请“向上投票”;如果您满意,请标记为“已回答”。