No need for a macro here, you simply need to define a common parent struct `person', and derive `customer' and `student' from this struct:
(struct person (name age)) (struct customer person (foo)) (struct student person (bar)) (person-name (customer "Joe" 34 'foo)) ; -> "Joe" The parent struct name must be given right after the struct name of the child. Laurent On Mon, Nov 25, 2013 at 3:20 PM, Ben Duan <[email protected]> wrote: > Hi All, > > If I have several structures, like the following: > > (struct customer (name age foo)) > (struct student (name age bar)) > > I choose the same representation for the `name` and `age` fields which are > `string?` and `natural-number/c`. So I think I could just define a `name` > accessor for both `customer-name` and `student-name` to save some typing. I > have to define the accesors by hand like: > > (define (name record) > (cond > ((customer? record) (customer-name record)) > ((student? record) (student-name record)))) > (define (age record) > (cond > ((customer? record) (customer-age record)) > ((student? record) (student-age record)))) > > 1. It's much repetitive work. Is there any built-in way to do these things? > I think macro can do these. But I'm trying to avoid macros as much as > I could, because I don't trust myself in designing macros. > > 2. Is it good or bad style to use one accessor for different structs? > > Thanks, > Ben > > > ____________________ > Racket Users list: > http://lists.racket-lang.org/users > >
____________________ Racket Users list: http://lists.racket-lang.org/users

