2015-03-02 51 views
0

我认为球拍的内部缩小总是用于评估,但我发现例如“如果”(和cond ?!)在球拍中是懒惰的评价...为什么这需要?球拍:内在减少还是懒惰评估?

是否无法通过内部还原实现if语句?

我不知道哪里的懒惰评价比内在好,反之亦然?有人可以提供一个例子吗?

+0

对于懒惰的评估,你有'#!lazy'这是一个[懒惰的球拍语言](http://docs.racket-lang.org/lazy/),非常类似于#!racket。由于'#!lazy'是懒惰的,所以'#!racket'中的'if'和其他特殊形式只是'#!lazy'中的普通过程。 – Sylwester 2015-03-02 21:49:37

回答

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不能作为一个正常的过程来实现,它必须是一个特殊的形式,因为它需要不同的评估规则。

+2

还要注意'cond'不是特殊的,因为它只是宏扩展为'if'表达式。 – 2015-03-02 21:08:02