解析嵌套数组结构

时间:2012-01-21 06:34:55

标签: arrays parsing clojure nested

我正在尝试解析以下形式的嵌套数组结构:

[element [[child1] [child2] [child3 [[subchild1] [subchild2]]]]]

我还想返回一个包含所有符号的列表(没有别的),无论嵌套深度如何;但是,我不是在寻找flatmapflatten等,因为我需要对每个元素执行更复杂的额外工作。

这是我到目前为止所提出的:

(defn create-element [rs element]
  (if (symbol? element)
    (cons element rs)
    rs))

(defn parse
  ([rs element] (create-element rs element))
  ([rs element [children & more]] (if (nil? more)
                                    (parse (parse rs element) (first children))
                                    (parse (parse rs element) (first children) more))))

(defn n-parse [element]
  (apply parse () element))

这适用于以下输入:

=> (n-parse ['bla [['asd] ['kkk] ['sss]]])
(sss kkk asd bla)

但这不起作用:

=> (n-parse ['bla [['asd] ['kkk [['ooo]]] ['sss]]])
(sss kkk asd bla)

我仍然试图绕着这些类型缠绕我的脑袋,但似乎无法设法使它正确。例如,Haskell使用模式匹配等方便这一点,而Clojure不允许相同的arity函数重载。

还有一种更简洁/惯用的方式(不必求助于if?)我更喜欢纯Clojure解决方案(没有外部库),因为这实际上是用于Clojurescipt项目。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

我没有看到flatten的错误。如果您想先对项目进行一些处理,请先完成工作,然后展平结果:

(defn map-tree
      "Example: (map-tree + [1 2 [3 5]] [3 4 [5 6]])"
    [f & trees]
    (if (every? coll? trees)
        (apply map (partial map-tree f) trees)
        (apply f trees)))

(defmulti transformator identity)
;; transform 'sss element into something special
(defmethod transformator 'sss [_] "sss")
;; default transformation
(defmethod transformator :default [v] v)

测试:

user> (flatten (map-tree transformator '[bla [[asd] [kkk] [sss]]]))
(bla asd kkk "sss")
user> 

这不起作用吗?