Arrays 嵌套数组结构的解析

Arrays 嵌套数组结构的解析,arrays,parsing,clojure,nested,Arrays,Parsing,Clojure,Nested,我正在尝试分析以下形式的嵌套数组结构: [element [[child1] [child2] [child3 [[subchild1] [subchild2]]]]] 我还想返回一个包含所有符号的列表,而不考虑嵌套深度;然而,我并不寻找flatmap或Flatte等,因为我需要对每个元素执行更复杂的额外工作 这就是我到目前为止的想法: (defn create-element [rs element] (if (symbol? element) (cons element rs)

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

[element [[child1] [child2] [child3 [[subchild1] [subchild2]]]]]
我还想返回一个包含所有符号的列表,而不考虑嵌套深度;然而,我并不寻找flatmap或Flatte等,因为我需要对每个元素执行更复杂的额外工作

这就是我到目前为止的想法:

(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?我更喜欢没有外部libs的纯Clojure解决方案,因为这实际上是用于Clojurescipt项目的


非常感谢您的帮助

我看不出扁平有什么问题。如果要先对项目执行某些操作,请先执行操作,然后展平结果:

(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)
测试:


那不行吗?

问题是,每当调用transformator时,我都需要父节点。我想到了这个:defn parse[rs parent[element&[children]]]让[[new parent new rs]创建元素rs parent element]如果为nil?子项新rs减少解析%1个新父项%2个新rs子项您认为有更好的方法吗?编辑:是的,注释中没有换行符。对不起。@Philip K如果对你有用,我会说没问题。问题是,如果你不知道你要做什么,就很难给出好的建议。自定义编写的解析器的复杂性可能增长得相当快。如果您已经知道解析器将变得更加复杂,那么可以尝试使用类似的库
user> (flatten (map-tree transformator '[bla [[asd] [kkk] [sss]]]))
(bla asd kkk "sss")
user>