 Front page | perl.perl6.language | Postings from April 2005

## Hyper operator corner case?

From:
David Christensen
Date:
April 12, 2005 20:58
Subject:
Hyper operator corner case?
Message ID:
8ee5453a04e222da193be6b74d08ec42@dwci.net
```Hey folks,

I wanted to delurk and address an issue that may need clarification in
regards to hyper operators.

Quoting S03:

> If one argument is insufficiently dimensioned, Perl "upgrades" it:
>      (3,8,2,9,3,8) >>-<< 1;          # (2,7,1,8,2,7)

Now in this example case, it's pretty clear that the scalar 1 gets
turned into a list of 1s with the length of the lhs.  What about the
case of a larger-dimensioned or single-dimensioned array?

Example:
(1,2,3,4,5) >>+<< (1,2)

Is this equivalent to:

a) (1,2,3,4,5) >>+<< (1,2,undef,undef,undef) (undef padding)
b) (1,2,3,4,5) >>+<< (1,2,1,2,1) (repetition)
c) (1,2,3,4,5) >>+<< (1,2,2,2,2) (stretching)
d) (1,2) >>+<< (1,2) (truncation)
e) something else, ie, warnings about mismatched dimension, die(),

Additionally, I was wondering if there was a difference between:

(3,8,2,9,3,8) >>-<< 1

and

(3,8,2,9,3,8) >>-<< (1)

I suppose the answer to that depends on the answer to the above
question.

If the answer is the a) case as above and undef resolves to 0
numerically, then we run into another issue to consider.  In the case
of addition and subtraction, 0 is the identity element, and so:

(1,2,3,4,5) >>+<< (1,2) yields (2,4,3,4,5).

But the intuitiveness goes away with multiplication, and completely
blows up with division:

(1,2,3,4,5) >>*<< (1,2) yields (1,4,0,0,0), probably not what we wanted.
(1,2,3,4,5) >>/<< (1,2) yields (1,1,NaN,NaN,NaN), and probably die()s
with division by zero errors.

If in the addition and subtraction cases we want to preserve the
identity cases for the slots not accounted for, undef is fine because
it resolves to 0; to provide the same features for multiplication and
division, the identity element would have to be 1.  But that would
suppose that the potential hyper-operators would know what their
appropriate identity elements were (and that such a thing is meaningful
to them).

Additionally, if there is a difference between the automatic scalar
promotion and list promotion, we could run into errors where people
would expect an expression to be a scalar which would be promoted in
the documented fashion, but would really be promoted in one of a)-e),
breaking what they expected:

(1..5) >>+<< (\$a-\$b) # list context for the expression?  Promotes like
what?
(1..5) >>+<< +(\$a-\$b) # forced scalar context -- promotes like
documented.
(1..5) >>+<< (1) # promotes like what?

Thoughts?

David Christensen

```