There is also the `struct*` pattern: https://docs.racket-lang.org/reference/match.html#(form._((lib._racket%2Fmatch..rkt)._struct*)) On Thu, Dec 20, 2018 at 12:48 AM Philip McGrath <[email protected]> wrote: > > On Mon, Dec 17, 2018 at 4:08 PM Jens Axel Søgaard <[email protected]> > wrote: >> >> However if you add a field to a struct foo, then you need to a new field to >> all patterns matching foos. >> If on the hand you used foo-bar then adding a field baz requires no changes >> to the existing code. > > > You can avoid this issue by writing a custom match expander. If needed, you > can even overload the same identifier to serve as a match expander, static > struct information, and constructor function, just as `struct` would normally > do. > > For example, if you had a struct: > (struct dog (name age)) > and then added a field to make it: > (struct dog (name age color)) > you could arrange so that, as a match pattern, > (dog n a) > would effectively expand to: > (dog n a _) > This would keep you from having to update any existing code. > > Doing this takes some work, even with macros to take care of the boilerplate, > so it seems to make most sense when you have a struct that's part of an API > (public or between parts of your project) and you want to avoid breaking > backwards compatibility. In such cases I often want to abstract as much as > possible anyway over how the datatype is implemented as a struct and present > the nicest interface possible to client code: for example, I will often make > the match pattern use optional keywords, because I don't like keeping track > of the order of fields in large and potentially-changing structs. I would > also note that, if you expose the struct-ness of your datatype to clients, > adding a field creates a similar compatibility problem with the constructor. > > -- > You received this message because you are subscribed to the Google Groups > "Racket Users" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout.
-- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.

