(defn divisible [xy](零?(rem xy)))
第一个表达式是真的,但不是第二个表达式为什么?
表单的表达式(or foo bar)不会将两个谓词"粘合"成一个复合谓词; foo如果它是真的,它会返回,否则bar.在你的代码中,(fn [x] (divisible x 3))当然是真实的(唯一的假值是false和nil),所以整个事情等同于
((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)
| 归档时间: |
|
| 查看次数: |
508 次 |
| 最近记录: |