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?

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(), segfault, kill -9 1 (whatever your sadism level is).

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(), segfault, kill -9 1 (whatever your sadism level is).

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.

(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?

(1..5) >>+<< +($a-$b) # forced scalar context -- promotes like documented.

(1..5) >>+<< (1) # promotes like what?

Thoughts?

David Christensen