Why Strings as Classes?

Nick Sabalausky a at a.a
Wed Aug 27 22:19:04 PDT 2008


"Steven Schveighoffer" <schveiguy at yahoo.com> wrote in message 
news:g95b89$1jii$1 at digitalmars.com...
>
> When someone sees an index operator the first thought is that it is a 
> quick lookup.

This seems to be a big part of the disagreement. Personally, I think it's 
insane to look at [] and just assume it's a cheap lookup. That's was true in 
pure C where, as someone else said, it was nothing more than a shorthand for 
a specific pointer arithmentic operation, but carrying that idea over to 
more modern languages (especially one that also uses [] for associative 
arrays) is a big mistake.

The '+' operator means "add". Addition is typically O(1). But vectors can be 
added, and that's an O(n) operation. Should opAdd never be used for vectors?

> You can force yourself to think differently, but the reality is that most 
> people think that because of the universal usage of square brackets 
> (except for VB, and I feel pity for anyone who needs to use VB) to mean 
> 'lookup by key', and usually this is only useful on objects where the 
> lookup is quick ( < O(n) ).  Although there is no requirement, nor 
> enforcement, the 'quick' contract is expected by the user, no matter how 
> much docs you throw at them.
>
> Look, for instance, at Tango's now-deprecated LinkMap, which uses a 
> linked-list of key/value pairs (copied from Doug Lea's implementation). 
> Nobody in their right mind would use link map because lookups are O(n), 
> and it's just as easy to use a TreeMap or HashMap.  Would you ever use it?
>
>> If you *really* need that sort of guarantee (and I can imagine it may be 
>> useful in some cases), then the implementation of the guarantee does 
>> *not* belong in the realm of "implements vs doesn't-implement a 
>> particular operator overload". Doing so is an abuse of operator 
>> overloading, since operator overloading is there for defining syntactic 
>> sugar, not for acting as a makeshift contract.
>
> I don't think anybody is asking for a guarantee from the compiler or any 
> specific tool.  I think what we are saying is that violating the 'opIndex 
> is fast' notion is bad design because you end up with users thinking they 
> are doing something that's quick.  You end up with people posting 
> benchmarks on your containers saying 'why does python beat the pants off 
> your list implementation?'.  You can say 'hey, it's not meant to be used 
> that way', but then why can the user use it that way?  A better design is 
> to nudge the user into using a correct container for the job by only 
> supporting operations that make sense on the collections.
>
> And as far as operator semantic meaning, D's operators are purposely named 
> after what they are supposed to do.  Notice that the operator for + is 
> opAdd, not opPlus.  This is because opAdd is supposed to mean you are 
> performing an addition operation.  Assigning a different semantic meaning 
> is not disallowed by the compiler, but is considered bad design.  opIndex 
> is supposed to be an index function, not a linear search.  It's not called 
> opSearch for a reason.  Sure you can redefine it however you want 
> semantically, but it's considered bad design.  That's all we're saying.
>

Nobody is suggesting using [] to invoke a search (Although we have talked 
about using [] *in the search function's implementation*). Search means you 
want to get the position of a given element, or in other words, "element" -> 
search -> "key/index". What we're talking about is the reverse: getting the 
element at a given position, ie, "key/index" -> [] -> "element". It doesn't 
matter if it's an array, a linked list, or a 
super-duper-collection-from-2092: that's still indexing, not searching.





More information about the Digitalmars-d mailing list