Since brev’s defines are just me hacking in matchable support in the define headers, and I didn’t know matchable that well at first, I’m always discovering new things that this means for brev’s define.
For example, it’s a match made in heaven when working with records.
(define-record horse leg-count name height)
(define (leg-heightitude ($ horse leg-count name height))
(* leg-count height))
(map leg-heightitude
(list
(make-horse 4 'Tornado 58/12)
(make-horse 8 'Sleipner 67/12)))
The first symbol after the dollar sign needs to be the record type, but then you can rename the slots; it goes by position, not name. You can omit unused trailing slots:
(define (label ($ horse lc n))
(conc n ", " lc "-legged horse"))
It’s still a generics define so you can define several different functions for polymorphic dispatch:
(define (label ($ bird name species))
(conc name " is a pretty bird"))
(map label barrel-of-unsorted-animals)