First off, thanks to Aristotle for clearing some of my thinking.

----- Original Message ----
From: A. Pagaltzis <[EMAIL PROTECTED]>

>    my %buckets = (
>        w => {
>            count => 4,
>            scale => 10.5,
>         },
<snip>
>    );
>
>    for %buckets.values -> $arg_for {
>        $arg_for<array> = [ ( 0 .. $arg_for<count> ) »*« $arg_for<scale> ];
>    }

In my version of Pugs (6.2.11 (r10390)), that fails for two reasons, both of 
which I suspect are bugs.  First, unless the hash elements have an "array => 
[]" pair, I seem to get the following error:

  *** Can't modify constant item: VUndef
      at bucket.p6 line 21, column 5-73

Line 21 in my code is the assignment to $arg_for<array>.

However, even putting that back in results in the exact same error, so I had to 
change the line to:

  $arg_for<array>.push((0 .. $arg_for<count>) >>*<< $arg_for<scale> );

Now you might be thinking that I simply needed change the $arg_for<array> 
assignment to a push and not included the "array => []" pair, but as it turns 
out, I need the pair *and* the push lest I get the VUndef error.

    for %buckets<w><array>.kv -> $i, $w {

Is .kv supposed to work there?  You're accessing an array, not a hash.

> I assume all those temporaries that I cleaned out were there for
> speed, in which case this will run slower, but they were too
> unsightly to keep around.

Yeah, that's why they were there.  However, the ($x, $y, $z).sum > $target is a 
much more useful performance hack, so you could get rid of the temporaries.

Cheers,
Ovid




Reply via email to