线程通过函数,除非不为null

时间:2014-11-22 15:21:54

标签: clojure

是否有内置宏?

(defn keep-looking-for-value-in-multiple-sources [value source1 source2 ...]
  (let [ ret (source1 value)]
       (if ret
         ret
         (let [ret (source2 value)]
           (if ret
             ret
             (...))))
       )
  )

我知道实现宏很容易,但也许有惯用法?

4 个答案:

答案 0 :(得分:4)

根据您是否可以false平等对待nil(如您的示例所示),您可以使用or

(or (source1 value)
    (source2 value)
    ...)

在大多数情况下,这不应该是不合理的冗长,但显然只有在您知道(并明确使用)要应用的函数集合时才有效。

答案 1 :(得分:3)

这就是我提出的

(some #(% value) [source1 source2])

答案 2 :(得分:1)

您不需要宏。您指定的函数大致为as you have it,具有合适的框架:

(defn keep-looking-for-value-in-multiple-sources [value & sources]
  (some #(% value) sources))

但这真的是你想要的吗?例如,

(keep-looking-for-value-in-multiple-sources -2 pos? odd? even?)
;true

......信息量不大。

我责备some。例如,如果我写

(some odd? (range))

......我直觉地期待1。事实上,我得到true,这是将odd?应用于(range)的后续元素的第一个真实结果。 IMO,some应该做的事情没有标准功能。

答案 3 :(得分:0)

user> (defn keep-looking [value & sources]
        (loop [s sources]
          (if-let [ret ((first s) value)]
            ret
            (recur (rest sources)))))
#'user/keep-looking
user> (keep-looking :something 
                    {:not-something 1}
                    {:something 3})
;=> 3