This is a new version of the fanciest define of all time a.k.a. match-generics.
The 1.X releases could not destructure in car position.
So stuff like:
(define ((foo bar) (? string? baz)) ...)
did work, but that (foo bar)
had to be the same for every
definition, and you could not use matchable’s various features in the
car position either. You could have:
(define ((foo bar) (? string? baz)) ...)
(define ((foo bar) a b c)) ...)
But you could not then also have:
(define ((foo bar baz) a b c)) ...)
Match-generics 2.1 removes this limitation.
Now this stuff works:
(define ((apple _) x) x)
(define ((apple 'twisted) x) ((as-list reverse) x))
2.1 does a better job at clearing out unused branches but also swaps
in case-lambda
when it doesn’t need the full power of matchable.
(And, just like the 1.X series, it swaps in vanilla lambda
when it
doesn’t need any fanciness at all.)
Dispatching isn’t just on the args anymore.
The new version can also backtrack from specializations into generic
fallbacks with the new require
function.
(define (mysterious a b) 'vanilla)
(define (mysterious a b)
(require even? (* a b))
(require even? (+ a b))
(require (< a b) 'neapolitan))
(map mysterious
'(1 2 2)
'(2 3 4))
⇒ (vanilla vanilla neapolitan)