2013-11-23 3 views
0

Есть ли способ в Clojure протестировать вектор и посмотреть, если он вложен, то есть способ тестирования [: a: b: c: d] vs. [[: a: b] [:CD]]?Тестирование векторов и вложенных векторов в Clojure

Я попытался тест

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

но остается верным для вложенных векторов а,

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

ответ

0

проверки, если любой из них являются последовательными, кажется, близки:

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

, потому что все базовые коллекции могут быть превращены в последовательности, хотя может потребоваться также проверить наличие массива Java s:

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

'(? Каждый # (не (е%)) Coll)' должен быть действительно '(не-любой е? Coll) '. – amalloy

+0

@Arthur Это частично связано с тем, как я использовал код, который вы написали выше. Есть ли четкий способ итерации сегмента кода после ': else'? Цель состоит в том, чтобы иметь возможность углублять n уровней в глубину коллекции. '(Defn тест-FUNC [XF] \t (конд \t (каждый # (не (последовательный%)) х) (применить FX) \t \t:? Еще (карта # (применить F%) х))) ' – sunspots

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)) 
Смежные вопросы