Racket 在参数列表上调用`and`

Racket 在参数列表上调用`and`,racket,Racket,是否有方法调用参数列表的和或或?像 (and (list #t #t #f)) ? 我试着写(apply和(list#t#t#f)),但没有成功。试着 在这种情况下,where本质上是一个标识函数 (apply and(list#t#t#f))不起作用的原因是和不是一个函数。它是一个宏,这是必需的,因为(和#f(error'foo))应该短路(计算为#f)。如果它是一个函数,则会导致错误。您可以使用关系库中的和(披露:我是作者): 以先前的答案为基础。一个穷人的做法是 > (ormap

是否有方法调用参数列表的
?像

(and (list #t #t #f))
?

我试着写
(apply和(list#t#t#f))
,但没有成功。

试着

在这种情况下,where本质上是一个标识函数

(apply and(list#t#t#f))
不起作用的原因是
不是一个函数。它是一个宏,这是必需的,因为
(和#f(error'foo))
应该短路(计算为
#f
)。如果它是一个函数,则会导致错误。

您可以使用
关系库中的和(披露:我是作者):


以先前的答案为基础。一个穷人的做法是

 > (ormap (lambda (x) (not (false? x))) (list #t #t #f))
 ## #t

 > (andmap (lambda (x) (not (false? x))) (list #t #t #f))
 ## #f

谢谢有没有一种方法可以不用调用
?您不能定义自己的函数来使用一个列表并使用适当的参数调用
ormap
?这个问题与回答相关:为什么要使lambda如此复杂?你可以把它设为
(ormap(λ(x)x)(list#t#t#f)
,它也可以达到同样的目的,甚至更好的
(ormap identity(list#t#t#f))
(require relation)

(any? (list #t #t #f)) ;=> #t
(all? (list #t #t #f)) ;=> #f
 > (ormap (lambda (x) (not (false? x))) (list #t #t #f))
 ## #t

 > (andmap (lambda (x) (not (false? x))) (list #t #t #f))
 ## #f