Apologies for trying to resuscitate this old horse, but a new idea
occurred to me.
Back in October I suggested that $a ^+= @b would act like reduce,
but in discussion
it was decided that it would act like length, by the interpretation:
$a ^+= @b
$a = $a ^+ @b
$a = ($a, $a, $a, ...) ^+ @b
$a = ($a+$b[0], $a+$b[1], ...)
$a = (a list in scalar context )
$a = length(@b)
I now pose the question: Is ^+= a "hyper assignment operator" or an
"assignment hyper operator"?
An "assignment hyper operator" would be interpreted as above, or with
two arrays as:
@a ^+= @b
@a = @a ^+ @b
@a = ($a[0] + $b[0], $a[1] + $b[1], ... )
A "hyper assignment operator" would be interpreted like this (doing the
"hyper" part first):
@a ^+= @b
$a[0] += $b[0], $a[1] += $b[1], ...
$a[0] = $a[0] + $b[0], $a[1] = $a[1] + $b[1], ...
With two arrays the method is different, but the end result is the
same. (One might be more
efficient than the other, but I won't speculate on that here.) But with
a scalar involved
the method and the result is different. $a = length(@b) is the
"assignment hyper operator"
interpretation. The "hyper assignment operator" interpretation looks
like this:
$a ^+= @b
($a, $a, $a, ...) ^+= @b
$a += $b[0], $a += $b[1], $a += $b[2], ...
which is DWIM: $a = reduce(@b), assuming, of course that $a is
initially zero.
For @a = $b, the end result also appears to be the same.
"assignment hyper operator"
@a ^+= $b
@a = @a ^+ $b
@a = @a ^+ ($b, $b, $b, ...)
@a = ($a[0]+$b, $a[1]+$b, $a[2]+$b, ...)
"hyper assignment operator"
@a ^+= $b
@a ^+= ($b, $b, $b, ...)
$a[0] += $b, $a[1] += $b, $a[2] += $b, ...
~ John Williams