在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 中 andor 是否短路?

以下是lat?(原子列表)的两个实现。一个使用cond ... else,另一个使用orand。我想知道它们是否等效,而答案取决于 orand 在 Scheme 中是否有短路评估。

(define lat?
  (lambda (l)
    (cond
         ((null? l) #t)
         ((atom? (car l)) (lat? (cdr l)))
         (else #f))))
使用condelse
(define lat?
  (lambda (l)
    (or (null? l)
        (and (atom? (car l))
             (lat? (cdr l))))))
使用orand

我认为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'会短路吗?的主要内容,如果未能解决你的问题,请参考以下文章

Scheme中用“and”和“or”编写程序

Perl 的 ( or, and ) 和 ( ||, && ) 短路运算符有啥区别?

python3基础-and和or的短路逻辑

Python中 and or 运算顺序详解 --- 短路逻辑

原创Python基础:你真的知道and和or的用法吗

写sql时,使用where 1=1进行条件拼接时 如果第一个条件不成立时,后面的条件会继续执行吗