Re: for all(@foo) {...}

2005-04-24 Thread Brad Bowman

 No, S03 is probably just wrong there.  Junctions are scalar values, and
 don't flatten in list context.  Maybe we need something like:
 
 for =all(@foo) {...}
 
 to iterate the junction.

  for all(1,2,3).values { say $_; }

reads nicely and works in pugs.

Also, flattening may get messy with nested junctions.

 for any(1,2,3) {...}
 
 then it would have done the next, because 1  2.

Confused myself there.  Thanks.

 =none(1,2,3) should return a list of all the things that aren't 1, 2,
 or 3 in random order.  Maybe a lazy implementation will be beneficial
 at that point.  :-)

none() outside of boolean context is lazily evaluated by my brain.
My eyes glaze over and I think about something else.

Brad
-- 
 When one is not capable of true intelligence, it is good to consult with
 someone of good sense. -- Hagakure http://bereft.net/hagakure/




for all(@foo) {...}

2005-04-23 Thread Brad Bowman
Hi,

I'm trying to understand the following section in S03:

  S03/Junctive operators

  Junctions are specifically unordered.  So if you say
for all(@foo) {...}
  it indicates to the compiler that there is no coupling between loop
  iterations and they can be run in any order or even in parallel.

Is this a for on a one element list, which happens to
be a junction, or does the all() flatten?

Is the whole block run once with 1,2 and 3, or does the 
junction go into the block and autothread each operation?

for all(1,2,3) {
   next if $_  2;  # testing 1 or all(1,2,3) ?
   %got{$_} = 1;
}
say %got.perl;  # (('2', 1), ('3', 1)) or () ?

The no coupling in s03 suggests to me that the right
answer is (('2', 1), ('3', 1)), but I'm just guessing.


Brad

-- 
  To ask when you already know is politeness. To ask when you don't know
  is the rule.  -- Hagakure http://bereft.net/hagakure/



Re: for all(@foo) {...}

2005-04-23 Thread Larry Wall
On Sun, Apr 24, 2005 at 03:02:16PM +1000, Brad Bowman wrote:
: Hi,
: 
: I'm trying to understand the following section in S03:
: 
:   S03/Junctive operators
: 
:   Junctions are specifically unordered.  So if you say
: for all(@foo) {...}
:   it indicates to the compiler that there is no coupling between loop
:   iterations and they can be run in any order or even in parallel.
: 
: Is this a for on a one element list, which happens to
: be a junction, or does the all() flatten?

No, S03 is probably just wrong there.  Junctions are scalar values, and
don't flatten in list context.  Maybe we need something like:

for =all(@foo) {...}

to iterate the junction.

: Is the whole block run once with 1,2 and 3, or does the 
: junction go into the block and autothread each operation?

I expect =all(@foo) would do the former, while all(@foo) would do
the latter, in which case you might as well have used given instead.

: for all(1,2,3) {
:next if $_  2;  # testing 1 or all(1,2,3) ?
:%got{$_} = 1;
: }
: say %got.perl;  # (('2', 1), ('3', 1)) or () ?

Well, { 2 = 1, 3 = 1 } is the more likely notation.

: The no coupling in s03 suggests to me that the right
: answer is (('2', 1), ('3', 1)), but I'm just guessing.

I think =all(@foo) should do what you expect there.  Without the =
it should return { 1 = 1, 2 = 1, 3 = 1 } since there's only one
loop iteration, and it is *not* true that all(1,2,3)  2.  If you'd
said

for any(1,2,3) {...}

then it would have done the next, because 1  2.

I should say that I don't see that =all() is different from =any().
They each just produce a list in random order.  Though I suppose,
if we say that =one(1,2,3) should randomly pick one value, then
=any(1,2,3) should pick anywhere from 1 to 3 values.  And, of course,
=none(1,2,3) should return a list of all the things that aren't 1, 2,
or 3 in random order.  Maybe a lazy implementation will be beneficial
at that point.  :-)

Larry