How about;

(defn get-accessors
  "Given a struct definition, return a map of its keys and generated
   accessors for each key."
  [the-struct]
  (let [st-kys (keys (struct the-struct))]
    (reduce (fn [accsrs ky] (assoc accsrs ky
         (accessor the-struct ky))) {} st-kys)))

(defstruct test-s :a :b :c)
(def acc (get-accessors test-s))
((acc :a) (struct test-s 5 3 2))
5

Obviously looking up the accessor to look up the value defeats the
performance objective, but not if you get the accessors once, "let" the
needed ones and then use them in a loop processing lots of strucs say.

On Tue, Jun 30, 2009 at 6:14 AM, samppi <[email protected]> wrote:

>
> Yes, but I'm not so sure that you can get usable accessors with those
> keys:
> Clojure 1.0.0-
> user=> (defstruct test-s :a :b :c)
> #'user/test-s
> user=> (defstruct test-2-s :a :b :c)
> #'user/test-2-s
> user=> (def accessor-a (accessor test-s :a))
> #'user/accessor-a
> user=> (accessor-a (struct test-2-s 5 3 2))
> java.lang.Exception: Accessor/struct mismatch (NO_SOURCE_FILE:0)
>
> But thanks for the tip anyway!
>
> On Jun 29, 6:47 pm, Adrian Cuthbertson <[email protected]>
> wrote:
> > As a matter of interest, one can get the keys keys in an unknown struct
> by
> > allocating an empty struct;
> >
> > (def st (create-struct :a :b :c))
> > (keys (struct st))
> > (:a :b :c)
> >
> > -Adrian.
> >
> >
> >
> > On Tue, Jun 30, 2009 at 12:14 AM, samppi <[email protected]> wrote:
> >
> > > Wonderful. Thanks for the answer.
> >
> > > On Jun 29, 2:47 pm, Rich Hickey <[email protected]> wrote:
> > > > On Jun 29, 4:59 pm, samppi <[email protected]> wrote:
> >
> > > > > clojure.xml/parse returns a PersistentStructMap. Is there a way to
> > > > > refer to its struct template? I wish to create accessors for its
> keys,
> > > > > such as :tag, :attrs, and :content, with the accessor function for
> > > > > speed.
> >
> > > > If you look at the top of xml.clj you'll see they already exist.
> >
> > > > Rich
> >
>

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google
Groups "Clojure" group.
To post to this group, send email to [email protected]
Note that posts from new members are moderated - please be patient with your 
first post.
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
-~----------~----~----~----~------~----~------~--~---

Reply via email to