【问题标题】:Racket: inner reduction vs. lazy evaluation?球拍:内部减少与惰性评估?
【发布时间】:2015-03-02 20:54:12
【问题描述】:

我认为球拍总是进行内部还原以进行评估,但我发现例如“如果”(和条件?!)是球拍中的惰性评估......为什么需要这个?

难道不能通过内部归约来实现if语句吗?

我不知道惰性评估在哪里比内部评估更好,反之亦然?有人可以举个例子吗?

【问题讨论】:

  • 对于惰性评估,您有@​​987654322@,这是一个与#!racket 非常相似的lazy racket language。由于#!lazy 是惰性的,所以if 和您从#!racket 知道的其他特殊形式只是#!lazy 中的普通过程。

标签: racket lazy-evaluation evaluation


【解决方案1】:

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

【讨论】:

  • 另请注意,cond 并不特殊,因为它只是宏扩展为 if 表达式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-08
  • 2013-03-11
  • 2017-01-18
  • 2018-11-11
  • 2019-07-31
相关资源
最近更新 更多