确保var是vector的最简单方法

时间:2013-07-17 21:27:13

标签: clojure

确保var是向量的“最简单”/最短的方法是什么?自编就好像是

(defn ensure-vector [x]
  (if (vector? x)
    x
    (vector x))

(ensure-vector {:foo "bar"})
;=> [{:foo "bar"}]

但我想知道是否已有核心功能可以做到这一点?他们中的许多人(seqvecvectorlist)要么在地图上失败,要么始终适用。

我也想知道这个功能的最佳名称是什么。 boxsingletonunitvcast-vectorto-vector->vector!vector,{{ 1}},vector!

我还想知道其他语言,比如Haskell,是否内置了这个功能。

1 个答案:

答案 0 :(得分:2)

我认为当值是集合时要使用的函数是vec,它将任何集合转换为向量。 vector函数接收结果向量的项作为其参数,因此当值既不是向量也不是集合时,可以使用它。

这是一种可行的方法:

(defn as-vector [x]
  (cond
    (vector? x) x
    (sequential? x) (vec x)
    :else (vector x)))

(map as-vector [[1] #{2 3} 1 {:a 1}])

我根据Coercions clojure.java.io as-fileas-url中的{{1}}协议选择了该功能的名称。