Clojure:when-let的快捷方式

Ant*_*ald 1 functional-programming clojure clojurescript

通过以下结构,可以进行真值测试(f1)并将结果保存到本地绑定变量a.如果真值测试是假的,整个表达式返回nil.如果它是真实的(不是假的),则将返回的值传递给第二个函数(f2)并返回它的结果.

(when-let [a (f1)]
   (f2 a))
Run Code Online (Sandbox Code Playgroud)

有捷径吗?我不需要变量a作为中间步骤.

Leo*_*hin 6

你可以从核心库获得的最接近的是 some->

(some-> (f1) (f2))
Run Code Online (Sandbox Code Playgroud)

它的行为略有不同when-let:因为some->每个非nil值的线程也会线程化false.在实践中,这种行为差异从来没有发生在我身上作为一个问题,因为返回你想要传递给另一个函数的函数的函数nil如果没有任何东西则返回,而不是false.


ama*_*loy 5

不,但你写一个很容易.bind除非你想阅读monad,否则我们会称之为无关紧要的原因:

(defn bind [v f]
  (when v (f v)))

(bind (f1) f2)
Run Code Online (Sandbox Code Playgroud)