我试图使用Dr.Racket
在Scheme中运行以下代码(foldr or #f '(#f #f #f #t))
现在,我希望这可以工作,因为
(foldr + 0 '(1 2 3))
工作得很好,返回6.
但是当我尝试使用逻辑运行它时,或者我得到"或:语法不好:或者"
我做错了什么?另外,是否有一种替代方法可以在不使用折叠的情况下计算列表或列表?
答案 0 :(得分:5)
在折叠or
的特定情况下,您应该使用ormap
。您可以将identity
(或甚至values
)作为与ormap
一起使用的函数传递。
> (ormap identity '(#f #f #f #f #t))
#t
> (ormap identity '(#f #f #f #f #f))
#f
通常,您只能折叠函数,而不能折叠宏,而or
是宏,因为它有短路行为。
答案 1 :(得分:1)
我的方案相当薄弱,但如果我没有弄错,或者是宏,而不是函数,那么你就不能在高阶调用中传递它。你可以把它包裹在一个lambda中,但是看起来不那么令人愉快:
(foldr (lambda (a b) (or a b)) #f '(#f #f #f #t)) => #t
如果您事先知道参数的数量,那么值得注意的是或者采用零个或多个参数:
(or) => #f
(or #f) => #f
(or #t) => #t
(or #t #f) => #t
(or #f #f #f #f #f) => #f
否则,你需要一个比我更有经验的Schemer来提供答案。