VLERange: a range in between BidirectionalRange and

foobar foo at bar.com
Sat Jan 15 10:21:12 PST 2011


Steven Schveighoffer Wrote:

> On Sat, 15 Jan 2011 12:11:59 -0500, Lutger Blijdestijn  
> <lutger.blijdestijn at gmail.com> wrote:
> 
> > Steven Schveighoffer wrote:
> >
> > ...
> >>> I think a good standard to evaluate our handling of Unicode is to see
> >>> how easy it is to do things the right way. In the above, foreach would
> >>> slice the string grapheme by grapheme, and the == operator would  
> >>> perform
> >>> a normalized comparison. While it works correctly, it's probably not  
> >>> the
> >>> most efficient way to do thing however.
> >>
> >> I think this is a good alternative, but I'd rather not impose this on
> >> people like myself who deal mostly with English.  I think this should be
> >> possible to do with wrapper types or intermediate ranges which have
> >> graphemes as elements (per my suggestion above).
> >>
> >> Does this sound reasonable?
> >>
> >> -Steve
> >
> > If its a matter of choosing which is the 'default' range, I'd think  
> > proper
> > unicode handling is more reasonable than catering for english / ascii  
> > only.
> > Especially since this is already the case in phobos string algorithms.
> 
> English and (if I understand correctly) most other languages.  Any  
> language which can be built from composable graphemes would work.  And in  
> fact, ones that use some graphemes that cannot be composed will also work  
> to some degree (for example, opEquals).
> 
> What I'm proposing (or think I'm proposing) is not exactly catering to  
> English and ASCII, what I'm proposing is simply not catering to more  
> complex languages such as Hebrew and Arabic.  What I'm trying to find is a  
> middle ground where most languages work, and the code is simple and  
> efficient, with possibilities to jump down to lower levels for performance  
> (i.e. switch to char[] when you know ASCII is all you are using) or jump  
> up to full unicode when necessary.
> 
> Essentially, we would have three levels of types:
> 
> char[], wchar[], dchar[] -- Considered to be arrays in every way.
> string_t!T (string, wstring, dstring) -- Specialized string types that do  
> normalization to dchars, but do not handle perfectly all graphemes.  Works  
> with any algorithm that deals with bidirectional ranges.  This is the  
> default string type, and the type for string literals.  Represented  
> internally by a single char[], wchar[] or dchar[] array.
> * utfstring_t!T -- specialized string to deal with full unicode, which may  
> perform worse than string_t, but supports everything unicode supports.   
> May require a battery of specialized algorithms.
> 
> * - name up for discussion
> 
> Also note that phobos currently does *no* normalization as far as I can  
> tell for things like opEquals.  Two char[]'s that represent equivalent  
> strings, but not in the same way, will compare as !=.
> 
> -Steve

The above compromise provides zero benefit. The proposed default type string_t is incorrect and will cause bugs. I prefer the standard lib to not provide normalization at all and force me to use a 3rd party lib rather than provide an incomplete implementation that will give me a false sense of correctness and cause very subtle and hard to find bugs.

More over, Even if you ignore Hebrew as a tiny insignificant minority you cannot do the same for Arabic which has over one *billion* people that use that language. 

I firmly believe that in accordance with D's principle that the default behavior should be the correct & safe option, D should have the full unicode type (utfstring_t above) as the default. 

You need only a subset of the functionality because you only use English? For the same reason, you don't want the Unicode overhead? Use an ASCII type instead. In the same vain, a geneticist should use a DNA sequence type and not Unicode text.   


More information about the Digitalmars-d mailing list