在Scheme中,'or'和'and'会短路吗?
Posted
技术标签:
【中文标题】在Scheme中,\'or\'和\'and\'会短路吗?【英文标题】:In Scheme, does `or` and `and` short circuit?在Scheme中,'or'和'and'会短路吗? 【发布时间】:2022-01-16 01:51:12 【问题描述】:Scheme 中 and
和 or
是否短路?
以下是lat?
(原子列表)的两个实现。一个使用cond
... else
,另一个使用or
和and
。我想知道它们是否等效,而答案取决于 or
和 and
在 Scheme 中是否有短路评估。
(define lat?
(lambda (l)
(cond
((null? l) #t)
((atom? (car l)) (lat? (cdr l)))
(else #f))))
使用cond
和else
(define lat?
(lambda (l)
(or (null? l)
(and (atom? (car l))
(lat? (cdr l))))))
使用or
和and
我认为or
短路了。为什么?我知道(car ())
和(cdr ())
各自生产Error: Attempt to apply…
。如果or
没有短路,那么(lat? ())
最终将评估(car ())
并产生错误。但是,(lat? ())
不会产生错误,因此(通过 Modus Tollens)or
短路。它是否正确? and
短路了吗?
【问题讨论】:
这能回答你的问题吗? why `and` operator in scheme is not an built-in procedure 【参考方案1】:是的,它们都根据r6rs specification 短路(没有在网上找到 r7rs 的 html 版本,但这里是r7rs specification 的 pdf 版本的链接,请参阅第 4.2 节):
如果没有
<test>s
,则返回#t
。否则,从左到右计算表达式,直到<test>
返回 #f 或到达最后一个<test>
。在前一种情况下,and 表达式返回#f
而不计算剩余的表达式。在后一种情况下,计算最后一个表达式并返回其值。
and
& or
随后被定义为test
。
【讨论】:
谢谢!只是想说,我发现您的第一个编辑一目了然更容易理解。 是的,我知道,规范是正式的,通常更难阅读。第一次编辑是类网站,而不是我声称的规范。以上是关于在Scheme中,'or'和'and'会短路吗?的主要内容,如果未能解决你的问题,请参考以下文章
Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有啥区别?