+1 to simplifying and just dealing with cursors for now.
You can probably simplify domain notes of when pre-start
and post-end are valid by stating that, outside of the general
"String Cursors" section, pre-start is never valid, and post-end
is only valid as an end argument.
string-cursor-ref and string-ref/cursor are redundant.
The string-split/cursors signature
(string-split/cursors string [separator [ limit ] ] start end)
suggests start/end are always required, but sep/limit are
optional. Anything other than
(string-split/cursors string [separator [ limit [ start [ end ]]]])
would be confusing.
Splitting on predicate is useful and in my experience more
common than substring. The opposite (tokenizing) and
both operations together (partitioning) can also be useful.
string-pad-both/cursors is well defined and useful for centering.
string-compress/cursors is a surprising name, since it has
nothing to do with general compression. There's no ambiguity
in string-remove-consecutive-duplicate-chars/cursors, but if you
want brevity then "collapse" or even "squash" may be better than
"compress".
I think the missing string searching and string-join are essential.
Other useful procedures: prefix?/suffix?/mismatch, string-chop
(chop into fixed-length chunks), string-replicate (xsubstring),
string-replace (from/to substrings), string-translate (from/to chars).
--
Alex