2

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

(foldr or #f '(#f #f #f #t))

现在,我希望这会起作用,因为

(foldr + 0 '(1 2 3))

工作得很好,返回 6。

但是当我尝试使用逻辑或运行它时,我得到“或:语法错误:或”

我究竟做错了什么?此外,是否有另一种方法可以在不使用折叠的情况下计算列表的或?

4

2 回答 2

5

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

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

通常,您只能折叠函数,不能折叠宏,并且or是一个宏,因为它具有短路行为。

于 2013-09-16T21:54:55.110 回答
1

我的方案相当弱,但如果我没记错的话,或者是一个宏,而不是一个函数,所以你不能在高阶调用中传递它。但是,您可以将其包装在 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

否则,您将需要比我更有经验的 Schemer 来提供答案。

于 2013-09-16T21:55:19.830 回答