On Thu, Nov 24, 2005 at 12:08:44AM +0100, Stéphane Payrard wrote: : What about array with holes as supported by Parrot?
We have prior art with hashes, but it's not clear how well that maps across. : Does .elems return the number of elements with or without : the holes? In Perl 5, non-existing array elements are still counted in size, but non-existing hash elements are not. And this is actually pointing to a distinction we have to make for hashes and arrays that we don't have to make for ^5, because the integers 0..4 always exist, whereas the keys of a hash or array come and go. When we speak of the domain of a hash that is declared my %hash{Str} we could be confusing the signature Str with the current domain of the mutating function, %hash.keys, which is presumably some subset of Str, since Str represents an infinite set. Put that together with use of 5 in a signature as a type. If you declare my num %hash{5} you may only index %hash with values that match the signature :(5). The long form of that declaration is my %hash :(5 --> num); Where I was going with S9 is that we can't afford to make my num @array[5;5;5] a shortcut for my @array :(0..4, 0..4, 0..4 --> Any) because that confuses the use of 5 as an enumerated type value with its use as a sizer. But the sizer notation is darn convenient, so that's where my num @array[^5;^5;^5] came from. Assuming my %hash{Str} = somevalues(); note the crucial distinction between my %newhash{%hash.sig} and my %newhash{%hash.keys} The latter produces a hash that may only be indexed by the *existing* keys of %hash. : Does iterating over the array iterates over the holes as well? I'd say @array.keys should leave out the holes by analogy with hashes. Presumably [EMAIL PROTECTED] would do the same. Earlier I said that I thought .keys should just iterate the top dimension, but I think that's probably wrong. Likely ,kv will most naturally alternate key tuples and values, so I think .keys is also returning key tuples, and we need some other notation for returning the keys of the first index. .topkeys seems stupid, but I'm working with a migraine today, so I'm stupid too. I feel like there's an obvious solution, but I can't see it. Sigh. In a sad twist of fate, you can't be as brilliant as you are some of the time all of the time. :-) : That would sound inefficient to do that over a mostly empty array. True 'nuff. I think Juerd's question comes down to whether [EMAIL PROTECTED] tracks existing elements or last element. I can see arguments for both sides. The Perl 5 bias was that you should probably use the hash interface if you have sparse data, and [EMAIL PROTECTED] tracks last rather than [EMAIL PROTECTED] But then the implementation of arrays in Perl 5 was such that non-existing elements still occupy an SV* slot, so it kind of made sense from an efficiency point of view. But it'd be kind of nice if @array went false when the last key disappeared from a sparse array. But maybe [EMAIL PROTECTED] doesn't always have to mean [EMAIL PROTECTED] == 0. Seems broken if not, though. : Related question, Is there a way to get a list of iterators : that iterate only over the non-holey parts of an array? Not in Perl 5. I think .keys/^ should probably do that. Larry