球拍:内部减少与懒惰评估?

Racket: inner reduction vs. lazy evaluation?

我认为球拍总是为了评估而进行内部还原,但我发现例如。 "if"(和 cond?!)是球拍中的惰性评估...为什么需要这个?

是否无法通过内部归约实现if语句?

我想不通惰性求值比内部求值好在哪里,反之亦然?有人可以举个例子吗?

ifcond不是"lazy",只是评价规则不同而已。例如,在下面的表达式中,只执行 ifconsequent 部分,因为 condition 恰好是 true:

(if (= 1 1)
    'ok
    (/ 1 0))
=> 'ok

如果执行了 alternative 部分,我们会出现被零除的错误。这不是惰性求值,它只是 if 表达式在 Scheme 中的工作方式。将上面的示例与这个示例进行比较:

(define (my-if condition consequent alternative)
  (if condition
      consequent
      alternative))

(my-if (= 1 1) 'ok (/ 1 0))
=> /: division by zero

现在我们正在使用过程的标准评估规则,在非惰性解释器中指定在执行过程的主体之前评估所有参数 - 因此会引发错误。 这就是为什么if不能作为一个正常的过程来实现,它必须是一个特殊的形式,因为它需要不同的评估规则。