Clojure:如果通过谓词真相测试则传递值

时间:2016-02-18 11:24:49

标签: clojure

是否可以删除let语句/避免以下代码中的中间'x'?:

(let [x (f a)]
   (when (pred? x) x))

我在以下用例中遇到了这个问题:

(let [coll (get-collection-somewhere)]
   (when (every? some? coll)  ; if the collection doesn't contain nil values
      (remove true? coll)))   ; remove all true values

因此,如果集合没有nil值,则只保留非真值,例如数字,字符串或其他值。

所以,我正在寻找这样的东西:

(defn pass-if-true [x pred?]
   (when (pred? x) x))

2 个答案:

答案 0 :(得分:1)

假设您不想定义pass-if-true函数,您可以做的最好的是匿名函数:

(#(when (every? some? %)
    (remove true? %))
 (get-collection-somewhere))

您还可以将谓词和转换提取到参数中:

(#(when (%1 %3) (%2 %3))
 (partial every? some?)
 (partial remove true?)
 (get-collection-somewhere))

答案 1 :(得分:1)

(f a)表单是防止收集构建功能运行两次所必需的:

(get-collection-somewhere)let

这是一个典型的习语,你正确地做到了。

当然,如果您已经拥有该集合并且未在此表达式中构建,则您不需要when-let

但是,您可能希望看到 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(peopleInMunicipality, $person, $person.surname == %@).@count > 0", @"Smith"];

https://clojuredocs.org/clojure.core/when-let

在某些情况下可以节省一些按键,但这不是其中之一。