Выражение вида (or foo bar)
не «склеивает» два предиката в один составной предикат;он возвращает foo
, если он правдив, в противном случае bar
.В вашем коде, (fn [x] (divisible x 3))
, конечно, верно (единственные ложные значения false
и nil
), так что все это эквивалентно
((fn [x] (divisible x 3)) 3)
((fn [x] (divisible x 3)) 5)
Что вы хотите сделать, это что-то вроде
(some #(apply % 3) [(fn [x] (divisible x 3)) (fn [x] (divisible x 5)])
(some #(apply % 5) [(fn [x] (divisible x 3)) (fn [x] (divisible x 5)])
; ^- here goes the thing being tested
В общем
(defn or-preds [& preds]
(fn [& args]
(some #(apply % args) preds)))
((or-preds (fn [x] (divisible x 3)) (fn [x] (divisible x 5))) 3)
((or-preds (fn [x] (divisible x 3)) (fn [x] (divisible x 5))) 5)
;; or simpler...
((or-preds #(divisible % 3) #(divisible % 5)) 3)