我认为球拍总是进行内部减少评估,但我发现例如“if”(和cond?!)是球拍中的懒惰评价......为什么需要这样做?
通过内部还原来实现if语句是不可能的吗?
我无法弄清楚懒惰评价在哪里比内在更好,反之亦然?有人可以提供一个例子吗?
答案 0 :(得分:4)
if
和cond
不是“懒惰”,他们只是有不同的评估规则。例如,在以下表达式中,只执行if
的结果部分,因为条件恰好是true
:
(if (= 1 1)
'ok
(/ 1 0))
=> 'ok
如果替代部分被执行,我们将得到除零错误。这不是懒惰的评估,它只是if
表达式在Scheme中的工作方式。将上述示例与此示例进行比较:
(define (my-if condition consequent alternative)
(if condition
consequent
alternative))
(my-if (= 1 1) 'ok (/ 1 0))
=> /: division by zero
现在我们正在使用标准的过程评估规则,在非惰性解释器中指定在执行过程的主体之前评估所有参数 - 因此会引发错误。 那是为什么if
不能作为正常程序实现,它必须是一种特殊形式,因为它需要不同的评估规则。