SICP 检查 eval 是一个 thunk?
SICP Checking eval is a thunk?
在 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?
有人可以解释一下这部分是如何协同工作的吗
评估的 return 值被强制执行。如果对象是块,则只能强制对象。所以它被检查,如果它是一个块。
正如 Sylwester 评论的那样,
当 eval 懒惰时,eval 返回的总是一个 thunk。当您需要强制执行时,仅强制执行一个级别可能是不够的,因此只要值为 thunk,它就会强制执行。第二个不是它是完全评估的实际强制值。想象一下,表达式 (+ a b) 需要先计算 +, a, b 才能实际应用,因此使用惰性计算表达式实际上不会是 运行 直到你强制它然后它会计算至少 4 个东西( a 和 b 可能也是需要强制的东西)
在 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?
有人可以解释一下这部分是如何协同工作的吗
评估的 return 值被强制执行。如果对象是块,则只能强制对象。所以它被检查,如果它是一个块。
正如 Sylwester 评论的那样,
当 eval 懒惰时,eval 返回的总是一个 thunk。当您需要强制执行时,仅强制执行一个级别可能是不够的,因此只要值为 thunk,它就会强制执行。第二个不是它是完全评估的实际强制值。想象一下,表达式 (+ a b) 需要先计算 +, a, b 才能实际应用,因此使用惰性计算表达式实际上不会是 运行 直到你强制它然后它会计算至少 4 个东西( a 和 b 可能也是需要强制的东西)