球拍:内部减少与懒惰评估?
Racket: inner reduction vs. lazy evaluation?
我认为球拍总是为了评估而进行内部还原,但我发现例如。 "if"(和 cond?!)是球拍中的惰性评估...为什么需要这个?
是否无法通过内部归约实现if语句?
我想不通惰性求值比内部求值好在哪里,反之亦然?有人可以举个例子吗?
if
和cond
不是"lazy",只是评价规则不同而已。例如,在下面的表达式中,只执行 if
的 consequent 部分,因为 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
不能作为一个正常的过程来实现,它必须是一个特殊的形式,因为它需要不同的评估规则。
我认为球拍总是为了评估而进行内部还原,但我发现例如。 "if"(和 cond?!)是球拍中的惰性评估...为什么需要这个?
是否无法通过内部归约实现if语句?
我想不通惰性求值比内部求值好在哪里,反之亦然?有人可以举个例子吗?
if
和cond
不是"lazy",只是评价规则不同而已。例如,在下面的表达式中,只执行 if
的 consequent 部分,因为 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
不能作为一个正常的过程来实现,它必须是一个特殊的形式,因为它需要不同的评估规则。