On Fri, Aug 8, 2008 at 7:41 PM, John M. Dlugosz
<[EMAIL PROTECTED]> wrote:
> How is @array[*-2] supposed to be implemented?
>
> S09<v28>
> // reported again 8-Aug-2008
>
> Is this magic known to the parser at a low level, or is it possible to
> define your own postcircumfix operators that interact with the
> interpretation of the argument?
IMHO, this can best be answered by the implementors: it depends on how
difficult it would be to enable user-defined code. My own bias would
be toward the latter; but I'm not an implementor.
> Does this use of * apply to any user-defined postcurcumfix:<[ ]> or just
> those defining the function for the Positional role, or what? And whether
> or not it always works or is particular to the built-in Array class, we need
> to define preciely what the * calls on the object, because I<those> may be
> overridden. For example, it is obvious that a lone * in an expression calls
> .length. But the *{$idx} and *[$idx] work by calling some method on the
> Array object, right? Something like @array.user_defined_index<May> to
> discover that May maps to 5, or @array.user_defined_index[5] to produce May.
> That is, the accessor .user_defined_index() returns an object that supports
> [] and {} just like an Array. It may or might not be an Array populated
> with the inverse mappings. But it behaves that way.
>
> But that doesn't work for multidimensional arrays. The meaning of *{} is
> dependent on its position in the list. This means that it must be able to
> count the semicolons! If the slice is composed at runtime, it needs to
> operate at runtime as well, and this implies that the called function is
> told which dimension it is operating upon!
This is also true when using a lone * in an expression: the number of
elements that it represents depends on which dimension it appears in.
As well, a similar point applies to **.
IIRC, there's supposed to be a 'shape' method that provides
introspection on the index. Exactly what it's capable of and how it
works has not been established AFAIK.
> Is it possible to write:
> @i = (1, 3, *-1);
> say @data[$i];
> and get the same meaning as
> say @data[1, 3, *-1]?
I believe so. IIRC, evaluation of * is lazy; it gets postponed until
there's enough context to establish what its meaning is supposed to
be.
--
Jonathan "Dataweaver" Lang