在Clojure中是否有办法测试一个向量并查看它是否嵌套,即一种测试[:a:b:c:d]与[[:a:b] [:c:d]]的方法?
我已经尝试过测试
(vector? [:a :b :c :d])
true
但对于嵌套向量也是如此,
(vector? [[:a :b] [:c :d]])
true
答案 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
。
现在,我们可以说如果某个元素是一个向量,那么它就是嵌套的。我们可以使用some
和vector?
谓词来测试:
(defn nested-vector? [v]
(some vector? v))
这将专门测试载体。但是,您可能希望采用适用于任何Sequential
数据结构的更通用的方法:
(defn nested? [coll]
(some sequential? coll))