In order to make the API more "functional" (in the mathematical sense), we should not give access to the source.
In fact, filters only ever use source for ensure-match-data-string.
So instead we can call ensure-match-data-string from the match-data reader, possibly closing over source.