l...@gnu.org (Ludovic Courtès) writes: > I find Cowan’s proposal for string iteration and the R6RS editors > response interesting: > > http://www.r6rs.org/formal-comments/comment-235.txt
Cowan was proposing a complex new API. I am not, nor did Gauche. An efficient implementation of string ports is all that is needed. > I also think strings should remain what they currently are, with O(1) > random access. I understand your position, and perhaps you are right. Unfortunately, the alternatives are not pleasant. We have a bunch of bugs in our string handling functions. Currently, our case-insensitive string comparisons and case conversions are not correct for several languages including German, according to the R6RS among other things. We could easily fix these problems by using libunistring, which provides the operations we need, but only if we use a single string representation, and one that is supported by libunistring (UTF-8, UTF-16, or UTF-32). So, our options appear to be: * Use only wide strings internally. * Reimplement several complex functions from libunistring within guile (string comparisons and case conversions). * Convert strings to a libunistring-supported representation, and possibly back again, on each operation. For example, this will be needed when comparing two narrow strings, when comparing a narrow string to a wide string, or when applying a case conversion to a narrow string. Our use of two different internal string representations is another problem. Right now, our string comparisons are painfully inefficient. Take a look at compare_strings in srfi-13.c. It's also broken w.r.t. case-insensitive comparisons. In order to fix this and make it efficient, we'll need to make several different variants: * case-sensitive * narrow-narrow * narrow-wide * wide-wide (use libunistring's u32_cmp2 for this) * case-insensitive * narrow-narrow * narrow-wide * wide-wide (use libunistring for this) The case-insensitive narrow-narrow comparison must be able to handle this, for example (from r6rs-lib): (string-ci=? "Straße" "Strasse") => #t I'm not yet sure what's involved in implementing the case-insensitive narrow-wide case properly. Best, Mark