On Thu, Jun 3, 2010 at 9:38 AM, YD <ydong.pub...@gmail.com> wrote:
> Hi,
>
> When 'destructure' is doing a map destructuring, 'pmap' is the
> function to use. 'pmap' will do some kind of process to the given
> bindings using these lines of code:
>                                bes (reduce
>                                     (fn [bes entry]
>                                       (reduce #(assoc %1 %2 ((val
> entry) %2))
>                                               (dissoc bes (key
> entry))
>                                               ((key entry) bes)))
>                                     (dissoc b :as :or)
>                                     {:keys #(keyword (str %)), :strs
> str, :syms #(list `quote %)})
>
> I'm confused. Since every time ((key entry) bes) evaluates to nil, the
> inner reduce will never really do some useful thing. What's the
> purpose of this piece of code?

Yes, if ((key entry) bes) is nil then the inner reduce simply
returns the binding map as it stands.  The purpose of this code
is to support the :keys, :strs, and :syms keys in map
destructuring:

        (let [{:keys [a b]} {:a 1 :b 2}] [a b])
        ;=> [1 2]

In this example, (key entry) will be :keys for one of the
iterations of the inner reduce.  When (key entry) is :keys, ((key
entry) bes) will be [a b], and the inner reduce will process each
item of that vector, finally returning {a :a b :b} as the whole
binding map.

Which means the above example does exactly the same things as:

        (let [{a :a b :b} {:a 1 :b 2}] [a b])
        ;=> [1 2]

...which is what you'd do if there was no support for :keys

--Chouser
http://joyofclojure.com/

-- 
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