Hmmm... It seems that this way does lie madness -- there's a fundamental 
ambiguity between autothreading happening inside or outside the declared 
loop, and there's no "least surprising" way to implement it.  Certainly 
inside the loop is the easiest and most natural to implement, but that acts 
strange from an API standpoint.  Outside the loop works well from an API 
standpoint but introduces all sorts of weird cases that the implementation 
has to consider.  

P5/PDL has some junction-like aspects, in that it does autothreading. 
We sidestep the issue by not allowing multiple-element PDLs in boolean 
comparisons, but treating single-element PDLs as scalars whenever possible.
This flows down to '..',  so (1..pdl(3)) returns (1,2,3) or does the Right 
Thing in scalar context --  but (1..pdl(3,4)) probably ought to throw an 
exception (it actually returns the empty set or always-false, depending on 
context).

I'm no language designer, but it seems to me that certain operators simply 
won't generalize well to the autothreaded case, and those operators should 
simply try to pick up the pieces -- ie treat single-element junctions like 
ordinary scalars, and treat empty junctions like undef values, but otherwise 
do something exceptional  (whether or not that involves throwing an actual 
exception).  My personal preference is that constructs like 1..($a|$b) should 
be disallowed.  It's certainly easy enough to expand the junction manually 
into a list and loop over that.

Note that other weird constructs in perl5, such as (1..[2,3]), do very 
surprising, architecture-dependent things.


Quoth Ashley Winters on Friday 18 February 2005 04:09 pm,
> On Fri, 18 Feb 2005 14:35:53 -0800, Ashley Winters
>
> <[EMAIL PROTECTED]> wrote:
> > 1 .. sqrt(10) -> LazyList of (1..3)
> > 1 .. sqrt(10|20) -> Junction of any(1,2,3, 1,2,3,4)
> >
> > LazyList does Iterator, but Junction does not. You'd have to use (1 ..
> > sqrt(3|6)).values to iterate through the possible values
> > semi-randomly.
>
> Okay, changed my mind again.
>
> 1 .. sqrt(10|20) -> Junction of any(1,2,3, 1,2,3,4)
>
> therefore, for(1 .. sqrt(10|20)) iterates ONCE, but $_ is a junction.
> Anything inside the loop which uses $_ would autothread. Anything
> which doesn't use $_ would only get called once. That's insane, right?
>
> for(1 .. sqrt(10|20) {
>     if($_ > 2) {}    # uses junctive value
>     say "Here";  # called once
>     bar($_);   # calls bar() lots of times
> }
>
> > More likely, I'm nuts.
>
> I'm definitely crazy. I give up! I'll stop now, since I clearly don't get
> it. :)
>
> Ashley Winters

Reply via email to