假设我想要返回包含[1 2 3 4]的某个子集的集合。是否包含1取决于w ?,是否包括2取决于x?,y?3,z?4。
如果我做了
[(if (w?) 1) (if (x?) 2) (if (y?) 3) (if (z?) 4)]
并且(x?)和(y?)评估为真,其他人为假,我最终
[nil 2 3 nil]
但我想要
[2 3]
有没有规范的方法来实现这一目标?它让人联想到列表理解,但不完全相同。
由于
编辑:
我猜我可以创建一张地图{1 w? 2 x? 3年? z 4?}然后reduce
根据它的值函数是否评估为真,可以通过消耗或不消耗每个键,但也许有更好的方法。
答案 0 :(得分:1)
这可以做你想要的:
(defn f [conds vs]
(when (seq vs)
(let [[c1 & cr] conds
[v1 & vr] vs]
(if c1
(cons v1 (f cr vr))
(f cr vr)))))
示例:
(f [false true true false] [1 2 3 4])
=> (2 3)
(f [true true false true false true] [1 2 3 nil 4 5])
=> (1 2 nil 5)