是否有内置宏?
(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
(...))))
)
)
我知道实现宏很容易,但也许有惯用法?
答案 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