在Scheme中使用带or逻辑运算符的foldr

在Scheme中使用带or逻辑运算符的foldr,scheme,Scheme,我正在尝试使用Dr.Racket在Scheme中运行以下代码 (foldr or #f '(#f #f #f #t)) 现在,我希望这能起作用,因为 (foldr + 0 '(1 2 3)) 还行,6岁 但是当我尝试使用逻辑or运行它时,我得到“or:or中的语法不好” 我做错了什么?还有,有没有一种不使用折叠计算列表的or的替代方法 在折叠或的特定情况下,应使用。您可以传入(甚至)作为要与ormap一起使用的函数 > (ormap identity '(#f #f #f #f #t)

我正在尝试使用Dr.Racket在Scheme中运行以下代码

(foldr or #f '(#f #f #f #t))
现在,我希望这能起作用,因为

(foldr + 0 '(1 2 3))
还行,6岁

但是当我尝试使用逻辑or运行它时,我得到“or:or中的语法不好”


我做错了什么?还有,有没有一种不使用折叠计算列表的or的替代方法

在折叠
的特定情况下,应使用。您可以传入(甚至)作为要与
ormap
一起使用的函数

> (ormap identity '(#f #f #f #f #t))
#t
> (ormap identity '(#f #f #f #f #f))
#f

通常,您只能折叠函数,不能折叠宏,
是宏,因为它有短路行为。

我的方案相当弱,但如果我没有弄错的话,或者是宏,不是函数,所以您不能在高阶调用中传递它。但是,您可以将其包裹在lambda中,这会导致外观不太美观:

(foldr (lambda (a b) (or a b)) #f '(#f #f #f #t)) => #t
如果您事先知道参数的数量,那么值得注意的是or接受零个或多个参数:

(or) => #f
(or #f) => #f
(or #t) => #t
(or #t #f) => #t
(or #f #f #f #f #f) => #f

否则,你需要一个比我更有经验的策划人来提供答案。

我看已经有人来了。Chris的ormap只是一张罚单。某些实现的可能副本具有boolean/or函数,该函数按预期工作。但是使用foldr和boolean/or可能不是最好的解决方案,因为一旦找到真实情况,它们不会短路。它将继续并折叠整个列表。