It still seems to me that LET* crosses an important border.
Everything else in the notation is simply concerned with operations on
sets of strings, which seems right. But LET* is concerned with the
form of your descriptions. If your notation is meant to address that
area too, I would really like to have a way to define parameterized
;; A list of words, and a list of numbers, separated by a semi:
;; A non-empty, comma-separated list of something:
(lambda (pat) (& pat (* "," pat))))
(word (+ (in (- "azAZ"))))
(number (+ (in (- "09")))))
(& (separated-list word) ";" (separated-list number)))
The above is all regexp notation, mind you. There's no Scheme in it.
I guess what I can't come up with is some motivating example for LET*
that is not also a motivating example for a much larger, clean, and
powerful system for working with regexps. In short, why stop there?