Hello,all

I'm new to functional programming,want to know how to address nested
inner seqs in clojure

(def a [[1 2 3 4] [ "ok" "metoo"] [ 5 8 9 ]])

1:  searching in a, if find one inner vector includes number 9 then
append it a number 13
 [[1 2 3 4] [ "ok" "metoo"] [ 5 8 9 ]]  => [[1 2 3 4] [ "ok" "metoo"]
[ 5 8 9 13]]

2: searching in a, if found two or many inner vectors include same
element the merge them as one inner vector
others not touch

(def b ( conj  a  [ 5  10 "oops"]))  => [[1 2 3 4] ["ok" "metoo"] [5 8
9] [5 10 "oops"]]
in b, [5 8 9] and [5 10 "oops"] both include 5, it should be merge to
[5 8 9 10 "oops"] :
[[1 2 3 4] ["ok" "metoo"] [5 8 9] [5 10 "oops"]]  => [[1 2 3 4] ["ok"
"metoo"] [5 8 9 10 "oops"]]


I only found one solution to question 1 using zipper :
(def dz (zip/vector-zip a))
(defn append-to-blocks [x y] ;lookup x in blocks,if found then add y
to inner block
   (loop [loc dz]            ;dz is blocks
     (if (zip/end? loc)
       (zip/root loc)
       (recur
        (zip/next
         (if (and (vector? (zip/node loc)) (includes? (zip/node loc) x))
           (let [new-coll (conj (zip/node loc) y)]
           (zip/replace loc new-coll))
           loc))))))

user=> (append-to-blocks 9 13)
[[1 2 3 4] ["ok" "metoo"] [5 8 9 13]]

but still not figure out one way to question 2, i have tried:
(defn merge-inner-blocks [x blocks] ;x is element maybe in many inner
blocks
  (let [with-out-x (for [b blocks :when (not (includes? b x))] b)
        with-x (for [b blocks :when (includes? b x)] b)]
    (def blocks (concat with-out-x (vector (flatten with-x))))))   ;
just merge them, not remove the same element

(merge-inner-blocks 5 b)
#'user/blocks
user=> blocks
([1 2 3 4] ["ok" "metoo"] (5 8 9 5 10 "oops"))  ; here how to remove
one of the "5"?  vector has changed to list?

3, I also found my solutions to this alike problems are not
concise,and a bit ugly, any libs or appropriate way to process inner
nested seqs in clojure? i thought those ops maybe frequently
encountered in practical programming

any ideas?

best regards
 bot

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to clojure@googlegroups.com
Note that posts from new members are moderated - please be patient with your 
first post.
To unsubscribe from this group, send email to
clojure+unsubscr...@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to