?->
is a combinator that takes a predicate test and a transformer, and returns a unary procedure that transforms its argument if the predicate applies.
That’s a mouthful. Let’s break it down with some examples:
You can make a car
that only cars if the list is not null:
(map (?-> (o not null?) car) '((a b c) () (1 2 3) () ()))
⇒ (a () 1 () ())
Or a reverse that only reverses if it receives a list:
(map (?-> list? reverse) '(a (l u f r e d n o w) "summer's" (y a d)))
⇒ (a (w o n d e r f u l) "summer's" (d a y))
The default when the predicate doesn’t apply is to just pass through the argument, but you can set a different default with a keyword argument:
(map (?-> (o not null?) car default: #f) '((a b c) () (1 2 3) () ()))
⇒ (a #f 1 #f #f)
As for the name, I know I said no new ASCII art names, but ? for predicates and -> for transformation are both grandfathered in.
?->
is available in brev-separate from version 1.52.