On 2004/9/06, Larry Wall wrote:

>Another possibility is that .[] always forces the "normal" view of an
>array as 0-based, and if you want non-0-based arrays you have to use
>the .{} interface instead, on the assumption that strange subscripts
>are more like hash keys than ranges of integers.

That's true.  But it's got me thinking about the connection between 
arrays and "associative" arrays.  In fact, the user doesn't need to know 
that a "hash" is implemented with a hash table, and an "array" isn't; 
and nothing stops you from using numbers as hash keys.  And if you 
restrict your "hash" to numeric keys, Perl could notice and optimise it 
into an array.  (Or integer keys, or positive integers, or a consecutive 
range of positive ints....)  

If we consider a generic "data structure" type (which may or may not be 
optimised under the hood for integral indices), then why shouldn't {} be 
the "index-by-name" interface, and [] the "index-by-ordinal" interface? 
(Does that mean [$x] is just a shorthand for {nth($x)}?)  

(Will P6 arrays/hashes have an ".index" method to return what index they 
are?  Or .index for the ordinal and .key for the name.  (Although .key 
is perhaps a bit too close to .keys when the member is itself a hash.))

Of course, there is one important difference between arrays and hashes: 
arrays are ordered.  People do keep asking about ordered hashes, though.  
There's no reason you couldn't use ordinals with a hash anyway (the 
"order" may not be particularly meaningful, but sometimes you don't care 
-- of course, in those cases you'd usually iterate through it, but it 
could be handy to be able to say %h[rand(last)] (except that isn't 
really quite how you'd say it, but you get the idea)).

Data structures might have default sorting by key (since that's what 
arrays have), but you could sort other ways... maybe nth takes a "by" 
adverb: "first"="first :by key", vs. "first :by value".  Hm, it probably 
should take a closure (along the lines of "sort").


Anyway, I'm rambling, but there's something to the idea of Perl offering 
some sort of generic "data structure" type...  

"my $hash is Struct;" would be the most general, no restrictions on 
keys, and no ordering, so Perl is free to use a hash table without 
worrying about the order.  

"my $array is Struct(keytype=>PosInt, ordering=>keywise)" has keys 
restricted to ints, and iterates in order by index, i.e. it's 
implemented as an ordinary array (where [$n] and {$n} refer to the same 
element).

"Hash" and "Array" types would be shorthand for those kinds of Structs, 
but you could define your own by providing suitable shapes and 
orderings.  (Hm, since Hashes are the most general, they're probably 
actually the base type, rather than "Struct", which does sound kinda 
silly, and probably sounds sillier if you're not used to C.)

I was also going to suggest an in-between type of structure, like a 
Collection in VB, that accepts anything for the key (or some useful 
restricted type?) but is ordered (in order of when elements were added).  
But I can't think of any character available for the sigil.  =)


                               - David "making a hash of things" Green

Reply via email to