>From S09: "The default hash iterator is a property called .iterator
that can be user replaced. When the hash itself needs an iterator for
.pairs, .keys, .values, or .kv, it calls %hash.iterator() to start
one. In item context, .iterator returns an iterator object. In list
context, it returns a lazy list fed by the iterator."
Would it be reasonable to allow hashes to use .[] syntax as something
of a shortcut for ".iterator in list context", thus allowing
autosorted hashes to partake of the same sort of dual cardinal/ordinal
lookup capabilities that lists with user-defined array indices have?
e.g.:
my %point{Int};
%point{3} = "Star";
say %point[0]; # same as 'say %point{3}'
say %point[1]; # error: asking for the second of one key is nonsense.
%point{-2} = "Base";
say %point[0]; # same as 'say %point{-2}'
say %point[1]; # same as 'say %point{3}'
Mind you, this could get messy with multidimensional keys:
my %grid{Int;Int};
%grid{3;-2} = "Star";
%grid{-2;3} = "Base";
say %grid[0;1]; # "Base"
say %grid[1;0]; # "Star"
say %grid[0;0]; # error? %grid{-2;-2} has never had anything assigned to it.
Still, it could be useful to be able to access an autosorted hash's
keys in an ordinal fashion.
Side issue: S09 doesn't specify whether or not you need to explicitly
declare a hash as autosorted. I'm assuming that the parser is
supposed to figure that out based on whether or not .iterator is ever
used; but it isn't immediately obvious from reading the "Autosorted
hashes" section. As well, there might be times when explicitly
declaring a hash as autosorted (or not) might be useful for
optimization purposes.
--
Jonathan "Dataweaver" Lang