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 可能也是需要强制的东西)