Racket 球拍-闭合并应用闭合

Racket 球拍-闭合并应用闭合,racket,interpreter,value-of,Racket,Interpreter,Value Of,所以我对球拍相当缺乏经验,但我正在写一个翻译 我一直无法深入了解闭包到底是什么,或者如何定义/解释“应用闭包”或“生成闭包” 我只是在用match等编写解释器的值 任何帮助都将不胜感激 以班级为例- (define value-of (lambda (exp env) (match exp [`,b #:when (boolean? b) b] [`,n #:when (number? n) n] [`(zero? ,n) (zero? (value-of n env))]

所以我对球拍相当缺乏经验,但我正在写一个翻译

我一直无法深入了解闭包到底是什么,或者如何定义/解释“应用闭包”或“生成闭包”

我只是在用match等编写解释器的值

任何帮助都将不胜感激

以班级为例-

(define value-of
 (lambda (exp env)
  (match exp
  [`,b #:when (boolean? b) b]
  [`,n #:when (number? n)  n]
  [`(zero? ,n) (zero? (value-of n env))]
  [`(sub1 ,n) (sub1 (value-of n env))]
  [`(* ,n1 ,n2) (* (value-of n1 env) (value-of n2 env))]
  [`(if ,test ,conseq ,alt) (if (value-of test env)
                              (value-of conseq env)
                              (value-of alt env))]
  [`(begin2 ,e1 ,e2) (begin (value-of e1 env) (value-of e2 env))]
  [`(random ,n) (random (value-of n env))]
  [`,y #:when (symbol? y) (apply-env env y)]
  [`(lambda (,x) ,body) (make-closure x body env)]
  [`(,rator ,rand) (apply-closure (value-of rator env)
                                  (value-of rand env))])))
考虑这个例子:

(define x 42)
(define f (lambda (y) (+ y x))
(f 1)
问题是:当评估
(f1)
时,需要哪些信息可用? 不知何故,if
x
的值需要存储起来以备将来使用。 一种解决方案是在闭包中存储整个环境的副本

(struct closure (args env expression))
(define f (make-closure '(y) the-environment '(+ y x))

更好的解决方案是分析表达式,只在闭包中存储自由变量。有关详细信息,请参阅SICP或EoPL。

请阅读计算机程序的结构和解释,第4章涉及口译员,它将解释您需要知道的所有内容。