Hi all,
I am relatively new to clojure. I am trying to port some toy code I
wrote for common lisp a few years ago (a boggle-like game which needs
a dictionary prefix trie to trim possible word matches).
My old code was fairly imperative in nature when creating the
dictionary trie, and so now I am having fun exercising my brain trying
to do the "right thing" with functional programming.
One thing I immediately ran up against were certain situations where I
have a map and want to "modify" a value several levels deep into the
hierarchy. Imagine the following structure:
(def nested-structure { :level 0,
:nested1 { :level 1,
:nested2 { :level 2,
:final-data "initial data"}}})
If I need to change the value for :final-data, the chain of nested
"assoc", and "get" becomes unwieldy (IMO). So I spent several hours
scanning through the API to see what might help me out in this. I
thought that the (->) macro was where it was at, but spun my wheels.
I thought potentially, that the destructuring capabilities of "let"
would help me out, but again I could not get anything to work the way
I wanted... I played around with various "reduce" concoctions
(accumulating closures) and even toyed with generating a macro, before
I realized how easy it was:
;; keys is a vector of steps in a path, navigating down a map
hierarchy
(defn path-rebind [map keys val]
(let [ [first & rest] keys
nested-val (get map first) ]
(if rest
(assoc map first (path-rebind nested-val rest val))
(assoc map first val))))
user> (path-rebind nested-structure [:nested1 :nested2 :final-data]
"new data")
{:nested1 {:nested2 {:final-data "new data", :level 2}, :level
1}, :level 0}
So, I have two questions:
1) Am I missing something from the API that could have done what my
function "path-rebind"? (I would have assumed that this would be a
common need and that programmers would not need to roll their own each
time)
2) Am I missing out on a clever "reduce" usage that could have made
this more in-line? i.e. how's my code?
It was after I made wrote this function and contemplated how I could
make it abstract (i.e. with vectors, lists, etc) that I noticed the
existence of the "zip" library... Maybe question 1) above is answered
by the "zip" library. Is/Will the zip library be the recommended
means by which to navigate/modify data structures of arbitrary depth,
branching, and concrete 'type' ?
daniel
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Clojure" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/clojure?hl=en
-~----------~----~----~----~------~----~------~--~---