Clojure 如何应用许多谓词函数中的每一个(`and`them)

Clojure 如何应用许多谓词函数中的每一个(`and`them),clojure,Clojure,我在向量fs中有许多谓词函数,我希望将它们全部和放在一起。这适用于前两个功能: ((and (first fs) (second fs)) value) 但是,我希望编写适用于所有函数的代码,无论函数有多少(应用和fs)不编译,因为和是宏 有关使用和的谓词函数的示例,请尝试以下操作: ((and number? integer?) 1) 编辑如果你没有阅读评论,上面的和结构都是不好的例子。对于实际工作的相同构造,使用每个pred而不是和,因为您使用的是谓词,这可能很有趣 在阅读了您的编辑后-

我在向量
fs
中有许多谓词函数,我希望将它们全部
放在一起。这适用于前两个功能:

((and (first fs) (second fs)) value)
但是,我希望编写适用于所有函数的代码,无论函数有多少<代码>(应用和fs)不编译,因为
是宏

有关使用
的谓词函数的示例,请尝试以下操作:

((and number? integer?) 1)

编辑如果你没有阅读评论,上面的
结构都是不好的例子。对于实际工作的相同构造,使用
每个pred
而不是

,因为您使用的是谓词,这可能很有趣

在阅读了您的编辑后-谢谢,我不知道,您可以使用
。此外,我已经编辑了我的答案,我想你肯定想应用每一个pred

((apply every-pred [number? integer?]) 1)
=> true
((apply every-pred [number? integer?]) "asdf")
=> false

看起来每个pred都是这个问题的好答案(我以前没有注意到!)。是
juxt
。它将多个函数应用于单个参数:

((juxt a b c) x) => [(a x) (b x) (c x)]
请注意,与
每个pred
不同,
juxt
函数不会短路,并且总是对列表中的每个函数进行求值。例如:

(ns tst.clj.core
  (:use clj.core clojure.test tupelo.test)
  (:require [tupelo.core :as t] ))

(defn f2 [x] (zero? (mod x 2)))
(defn f3 [x] (zero? (mod x 3)))
(defn f5 [x] (zero? (mod x 5)))

(def f235 (apply juxt [f2 f3 f5] ))
这给了我们以下结果:

(f235 2) => [true false false]
(f235 3) => [false true false]
(f235 5) => [false false true]
(f235 6) => [true true false]
(f235 10) => [true false true]
(f235 15) => [false true true]
(f235 30) => [true true true]

(every? truthy? (f235 15)) => false
(every? truthy? (f235 30)) => true
其中
truthy?
函数类似于
boolean

(defn truthy?
  "Returns true if arg is logical true (neither nil nor false); otherwise returns false."
  [arg]
  (if arg true false))

请注意,您的原始示例并没有说
(和(f1 x)(f2 x))
,而是说
(和f1 f2)=>f1
。所以当你打字的时候

(def fs [f1 f2 f3 f4])
((and (first fs) (second fs)) value)

=> ((and f1 f2) value)
=> (f1 value)

这并不能给出你想要的结果。

你试过把它们放在
do
块中吗?否-不知道该怎么做或者为什么要这样做-没有副作用我编辑了我的答案。我很确定每个pred都能完全满足您的要求。修复了代码片段,我很抱歉。您上一个使用
的示例实际上不起作用
返回最后一个truthy值,函数为truthy,因此只调用最后一个函数。请尝试
((和string?integer?)1)
。我修复了它,对此表示抱歉。明确地说,所需的函数是
(部分应用每个pred)