2016-09-29 42 views
2

所以我对球拍相当缺乏经验,但我正在写一个解释器。球拍 - 封关和封袋

我一直无法找到关于闭包究竟是什么的洞察,或者如何定义/解释“应用闭包”或“闭包”。

我写只是一个价值的解释与比赛等

任何帮助将不胜感激。

鉴于例如,从类 -

(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

请阅读计算机程序的结构和解释,第4章介绍解释器,它会解释所有你需要知道的。 –

回答

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。