Generally, I like the whole thing quite a lot. I would love to have
it around, and I would accept it in its current form without much
whining.
I agree with all of Erik Hilsdale's comments, I believe. In
particular:
* Be consistent about the "string-" prefix for names.
* Let me do the three-arg-string version; i.e., String = S x N x N,
a tuple of the string-data and two natural numbers. My own reasons
for this have to do with using "extra argument" monads:
T(A) = Y --> A x Y
where I may want to use String (the tuple version) as the Y.
* [end start] versus [start end]: I definitely vote for keeping the
same order as everywhere else. I know there are reasons to reverse
it, but I won't remember them while I'm programming.
* I vote liberal on the copying issue. In fact, I go along with Erik
and say we ought to be able to assume sharing unless a specific copy
is requested. I'd be willing to drop the multiple versions of the
procedures with "/shared" or "/fresh" or whatever and do an explicit
"string-copy" if I want something new. If my compiler has already
made a copy, it can optimize my request away.
* "for-each" means left-to-right. What about "string-apply" for the
thing that just applies the given procedure to all the characters,
in no particular order and with no particular result?
* I vote for "string-empty?" instead of "string-null?".
* We have to be careful about the whole "words" thing, unless we are
willing to start dealing with locales, internationalization, etc.
Jonathan