在Clojure中测试向量和嵌套向量

时间:2013-11-23 05:19:23

标签: clojure clojure-contrib

在Clojure中是否有办法测试一个向量并查看它是否嵌套,即一种测试[:a:b:c:d]与[[:a:b] [:c:d]]的方法?

我已经尝试过测试

(vector? [:a :b :c :d])
 true

但对于嵌套向量也是如此,

(vector? [[:a :b] [:c :d]])
 true

2 个答案:

答案 0 :(得分:0)

检查它们中的任何一个是否是连续的似乎很接近:

user> (every? #(not (sequential? %)) [:a :b :c :d])
true
user> (every? #(not (sequential? %)) [:a :b :c :d [:e]])
false

因为所有基本集合都可以组成序列,但可能还需要检查Java数组:

(every? #(not (sequential? %)) [:a :b :c :d (into-array [1 2 3])])

答案 1 :(得分:0)

如果

vector?的参数是一个向量(实现true),则返回IPersistentVector[:a :b :c :d]是一个向量。 [[:a :b] [:c :d]]也是如此。因此,在其中任何一方上调用vector?都会返回true

现在,我们可以说如果某个元素是一个向量,那么它就是嵌套的。我们可以使用somevector?谓词来测试:

(defn nested-vector? [v]
  (some vector? v))

这将专门测试载体。但是,您可能希望采用适用于任何Sequential数据结构的更通用的方法:

(defn nested? [coll]
  (some sequential? coll))