【发布时间】:2013-07-04 20:54:37
【问题描述】:
SICP 中的This 章节说actual-value 用于提取thunk 的实际值的定义是这样的:
(define (actual-value exp env)
(force-it (eval exp env)))
但是如果exp 本身就是一个重击呢?根据delay-it 的定义,这意味着它是(list 'thunk exp env) 形式的列表对象。然而,eval 函数并没有准备好处理以 'thunk.为什么 eval 由于 cond 表达式不匹配而不会产生错误?
编辑: 我认为评估以下表达式应该会导致错误:
(define (add a) (+ 2 a))
(add 0)
add 是一个复合过程,因此delay-it 在应用之前对其参数执行。 + 是一个原始产生,这意味着 actual-value 将在其参数上被调用。论据是 2 和 a。 a 是一个 thunk 对象,因此 actual-value 在将其传递给 eval 时应该会产生错误,因为 eval 没有处理带有 'thunk 标记的列表的条件情况。
【问题讨论】:
-
你能提供一个发生这种情况的实际代码示例吗?我有一种预感,它不可能在实践中发生,通过构造
-
@ÓscarLópez:我添加了一个例子。
标签: scheme lazy-evaluation sicp thunk