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

时间:2015-03-02 20:54:12

标签: racket lazy-evaluation evaluation

我认为球拍总是进行内部减少评估,但我发现例如“if”(和cond?!)是球拍中的懒惰评价......为什么需要这样做?

通过内部还原来实现if语句是不可能的吗?

我无法弄清楚懒惰评价在哪里比内在更好,反之亦然?有人可以提供一个例子吗?

1 个答案:

答案 0 :(得分:4)

ifcond不是“懒惰”,他们只是有不同的评估规则。例如,在以下表达式中,只执行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不能作为正常程序实现,它必须是一种特殊形式,因为它需要不同的评估规则。