On May 4, 7:23 am, Nathan Hawkins <uts...@gmail.com> wrote:
> Possibly I'm going about this wrong. I'm trying to understand how best
> to construct maps from sequences, by applying a function which returns a
> key / value pair.
>
> Something like this:
>
> (ns test (:use clojure.contrib.str-utils))
>
> (def test-str "foo=1;bar=2;baz=3")
>
> (defn split-kv [text]
> (let [[k v] (re-split #"=" text )]
> {k v}))
>
> (defn split-pairs [text]
> (re-split #";" text))
>
> (map split-kv (split-pairs test-str))
>
> -> ({"foo" "1"} {"bar" "2"} {"baz" "3"})
>
> Doesn't really do what I had in mind. And yeah, I figured out that I can
> convert that to a hash-map in various ways, but I had expected map to be
> able to do this. So I wrote this:
>
> (defn map-assoc
> "Returns a map consisting of f applied to coll, where f is a function
> returning a key and value. f can return either a sequence with two
> values or a single item map."
> [f coll]
> (loop [map {}
> s (seq coll)]
> (if s
> (let [item (f (first s))]
> (recur (if (associative? item)
> (conj map item)
> (assoc map (first item) (second item)))
> (next s)))
> map)))
>
> This seems a little bit more like what I expected:
>
> (map-assoc split-kv (split-pairs test-str))
>
> -> {"baz" "3", "bar" "2", "foo" "1"}
>
> Am I overlooking some already existing function hidden away someplace
> that does this?
user> (apply hash-map (clojure.contrib.str-utils/re-split #"[=;]"
"foo=1;bar=2;baz=3"))
{"foo" "1", "bar" "2", "baz" "3"}
This solution makes a lot of assumptions about the input data, of
course.
--~--~---------~--~----~------------~-------~--~----~
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
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
-~----------~----~----~----~------~----~------~--~---