clojure.core /或partial函数适用于第一个参数但不适用于第二个参数

Jig*_*gar 4 clojure

(defn divisible [xy](零?(rem xy)))

  1. ((或(fn [x](可分割的x 3))(fn [x](可分的x 5)))3)
  2. ((或(fn [x](可分x 3))(fn [x](可分x 5)))5)

第一个表达式是真的,但不是第二个表达式为什么?

  • 有人可以解释一下这里发生的事情吗?

Mic*_*zyk 5

表单的表达式(or foo bar)不会将两个谓词"粘合"成一个复合谓词; foo如果它是真的,它会返回,否则bar.在你的代码中,(fn [x] (divisible x 3))当然是真实的(唯一的假值是falsenil),所以整个事情等同于

((fn [x] (divisible x 3)) 3)
((fn [x] (divisible x 3)) 5)
Run Code Online (Sandbox Code Playgroud)

你想做的就是这样

(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
Run Code Online (Sandbox Code Playgroud)

一般来说,

(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)
Run Code Online (Sandbox Code Playgroud)