问题描述
在 SICP 的第 4.2.2 节中,
(define (list-of-arg-values exps env)
(if (no-operands? exps)
'()
(cons (actual-value (first-operand exps) env)
(list-of-arg-values (rest-operands exps)
env))))
来电
(define (actual-value exp env)
(force-it (eval exp env)))
来电
(define (force-it obj)
(if (thunk? obj)
(actual-value (thunk-exp obj) (thunk-env obj))
obj))
根据thunk结构
(define (delay-it exp env)
(list 'thunk exp env))
(define (thunk? obj)
(tagged-list? obj 'thunk))
如果第一个操作数是 thunk ,为什么要检查 eval 是否是 thunk?
如果操作数是一个 thunk,它将类似于“list thunk
exp `env”。但是为什么要测试 eval 是否为 thunk?
谁能用一个例子解释一下这部分是如何一起工作的
解决方法
正如西尔韦斯特评论的那样,
当 eval 懒惰时, eval 返回的总是一个 thunk。当您需要强制执行它时,仅强制执行一个级别可能还不够,因此只要值是 thunk,它就会强制执行。第二个不是它是完全评估的实际强制值。想象一下,表达式 (+ ab) 在实际应用之前需要对 +,a,b 求值,因此使用惰性求值,表达式实际上不会运行,直到您强制执行它,然后它将至少求值 4 项(a 和 b 可能是东西也需要强迫)
,求值的返回值被强制执行。一个对象只能被强制,如果它是一个块。所以它被检查,如果它是一个块。