我认为球拍的内部缩小总是用于评估,但我发现例如“如果”(和cond ?!)在球拍中是懒惰的评价...为什么这需要?球拍:内在减少还是懒惰评估?
是否无法通过内部还原实现if语句?
我不知道哪里的懒惰评价比内在好,反之亦然?有人可以提供一个例子吗?
我认为球拍的内部缩小总是用于评估,但我发现例如“如果”(和cond ?!)在球拍中是懒惰的评价...为什么这需要?球拍:内在减少还是懒惰评估?
是否无法通过内部还原实现if语句?
我不知道哪里的懒惰评价比内在好,反之亦然?有人可以提供一个例子吗?
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
不能作为一个正常的过程来实现,它必须是一个特殊的形式,因为它需要不同的评估规则。
还要注意'cond'不是特殊的,因为它只是宏扩展为'if'表达式。 – 2015-03-02 21:08:02
对于懒惰的评估,你有'#!lazy'这是一个[懒惰的球拍语言](http://docs.racket-lang.org/lazy/),非常类似于#!racket。由于'#!lazy'是懒惰的,所以'#!racket'中的'if'和其他特殊形式只是'#!lazy'中的普通过程。 – Sylwester 2015-03-02 21:49:37