James Reeves wrote:
Hi folks,

I've been experimenting with the new type system in Clojure 1.2, but
I've hit something of a problem. If I define a record:

user=> (defrecord Foo [])
user.Foo

Then I can coerce a map into a type Foo like so:

user=> (def m {:x 1, :y 2})
#'/user/m
user=> (Foo. {} m)
#:user.Foo{:x 1, :y 2}

But what if I define an argument in the record constructor?

user=> (defrecord Bar [x])
user.Bar

I can't use (Bar. {} m); I'd have to use (Bar. (m :x) {} (dissoc
m :x)), but this depends on me knowing in advance that x is an
argument in Bar's constructor.

So is there a programmatic way of telling what keys a record derives
from its constructor? Or if there is any other way of coercing a map
into an arbitrary record?

- James

How about merging?

user=> (merge (Bar. {}) m)
#:user.Bar{:x 1, :y 2}

This approach at least doesn't require that you know in advance the keys of Bar.

-Ben

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