所以我对Racket缺乏经验,但我正在写一名翻译。
我一直无法找到关于闭包是什么,或者如何" apply-closure"或" make-closure"将被定义/解释。
我只是用匹配等来写一个解释器的值。
非常感谢任何帮助。
给出来自班级的例子 -
(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))])))
答案 0 :(得分:2)
考虑这个例子:
(define x 42)
(define f (lambda (y) (+ y x))
(f 1)
问题是:评估(f 1)
时需要提供哪些信息?
不知何故,需要存储x
以供以后使用的值。
一种解决方案是在闭包中存储整个环境的副本。
(struct closure (args env expression))
(define f (make-closure '(y) the-environment '(+ y x))
更好的解决方案是分析表达式并仅在闭包中存储自由变量。有关详细信息,请参阅SICP或EoPL。