SICP 检查 eval 是个笨蛋?

问题描述

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

,

求值的返回值被强制执行。一个对象只能被强制,如果它是一个块。所以它被检查,如果它是一个块。