Я пытаюсь проанализировать структуру вложенного массива следующей формы:
[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 не допускает перегрузки той же функции арности.
Также есть более краткий / идиоматический способ (без необходимости прибегать к нему, если?)Я предпочитаю чистые решения Clojure (без внешних библиотек), так как на самом деле это проект Clojurescipt.
Большое спасибо за любую помощь!