Idiomdrottning’s homepage

Record destructuring with brev

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)