Hello,

[This is another currently unfixed point of D2 that prevents us implementing 
our project the way we wish it.]

AFAIK, using '$' for custom collection types is not yet possible: oDollar is 
simply not implemented (correct?). But why do we need it? I do not understand 
the logic requiring an opDollar special method to "desugarise" the '$' 
operator. For me, '$' simply means length, so I would be fully happy with the 
simple rewrite of
    coll[$]  coll[$-i] coll[i..$]
to
    coll[coll.length]   coll[coll.length-i]   coll[i..coll.length]
et caetera.
I have thought at two objections against this.

First, 'length' is not a language-defined special member. Actually, it is 
already one for the 3 kinds of D arrays --if coll is an array, '$' actually 
maps to length, I guess. We could extend this principle to programmer-defined 
collections: make 'length' a special member, just like opIndex or range 
properties; it is just a decision to take.
Precisely, if needed, index could be either a plain data member _or_ a 
property, possibly depending on the kind of collection (or rather on whether 
the designer wants to maintain length or compute it on demand).
Finally, I consider 'length' as already somewhat special for random-access 
ranges: how else determine index validity, or simply the end point?

Second, length (in the sense of size, or count of elements) may not really make 
sense for every kind of collections. For instance, there are open, potential, 
sequences like the set of all integer cubes. Also, there are collections for 
which the notion of element --thus of count-- is ambiguous or unclear (eg 
sequences in which elements should be grouped like code unit strings, or trees 
for which only some nodes hold actual elements,...).
But precisely, I think such non-trivial kinds of collections which do not 
conceptually have (an obvious) length also do not support '$' (in a simple 
way). I vaguely have in mind a kind of equivalence class between collections 
for which indexing/slicing makes full sense and the notion of random-access 
range with its special attribute 'length'. What so you think?
For what it's worth, python's equivalent to [i..$] ([i:]) is AFAIK actually 
rewritten to the magic __len__ method for custom types. The equivalent of D's 
coll[$-1] (coll[-i]) is rewritten to coll[coll.__len__()-i]. I do not know of 
any practicle issue or limitation of this design in Python --a language in 
which many features have been fixed or generalised along times.

[OT]
Precisely, has a python-like syntax of negative indices and slice expressions 
open on right side been considered for D? Like:
    coll[-3]    // third element, counting from right side
    coll[1..-1] // all but first and last elements
    coll[3..]   // all but first 3 elements
and maybe (?)
    coll[..3]   // first 3 elements
I would very much prefere D's explicite notation if ever "$" had any sensible 
meaning in context. (I also prefere explicite '0' than an open interval on left 
side.) But as "$" makes no sense, and no other ASCII sign can do the job well, 
I find python's choice finally better. Also, intervals open on either side 
would be consistent with D's current use of [], I guess. 
[/OT]


Denis
-- -- -- -- -- -- --
vit esse estrany ☣

spir.wikidot.com

Reply via email to