Clojure:内置或单行解决方案,将nil插入集合中

时间:2017-12-03 23:06:19

标签: collections clojure

考虑以下函数调用:(into [] (some_expression))

让我们说(some_expression)可能会产生nil,或者某个有效的向量(例如[1 2 3])。我想要实现的是,如果(some_expression)的结果是nil,那么我最终会使用[nil],而不是[](执行{{1}后) })。 (当然,如果它是一些有效的向量,如into,那么我希望[1 2 3]。)

到目前为止我考虑过的可能性:

  • vec:错误,因为[1 2 3],因此最终结果仍为(vec nil) = []
  • vector:错误,因为[],因此,最终结果将为(vector [1 2 3]) = [[1 2 3]]。 (但它适用于[[1 2 3]]。)
  • 自定义函数,例如this related question中的nilensure-vector:这可以解决问题,但我会问是否有更短的内容(可能内置于Clojure中)实现相同的
  • 我也知道以下解决方法,但对我来说有点笨拙:as-vector

我担心没有简短的解决方案,因为否则会在这个问题中提及;还是那个人已经很老了,所以我希望他们从那时起就可以将这个功能添加到Clojure中。

此外,该问题存在一些重要差异:

  • 如上所述," (into [] (let [result (some_expression)] (if (nil? result) [nil] result)))"我正在寻找的只能为ensure-vector工作。 (即,如果nil返回(ensure-vector 2)而不是2,那就没问题了。)我想这不算数,但是谁知道。
  • 一种与" [2]"完全不同的方法。也没关系。例如,如果ensure-vector有一些特殊参数导致它将into参数解释为要插入的值而不是源集合,那么这也将解决我的问题。 (这更多是为了举个例子:据我所知documentation of into,它没有这样的形式。虽然,坦率地说,我不太确定from是什么意思在xform。但我想这是别的......)

1 个答案:

答案 0 :(得分:4)

如果T2_val3产生[nil]some-expression

or可让您指定nil的后备:

false