我正在尝试解析以下形式的嵌套数组结构:
[element [[child1] [child2] [child3 [[subchild1] [subchild2]]]]]
我还想返回一个包含所有符号的列表(没有别的),无论嵌套深度如何;但是,我不是在寻找flatmap
或flatten
等,因为我需要对每个元素执行更复杂的额外工作。
这是我到目前为止所提出的:
(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项目。
非常感谢您的帮助!
答案 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>
这不起作用吗?