develooper Front page | perl.perl6.language | Postings from January 2004

RE: Semantics of vector operations (Damian)

Thread Previous | Thread Next
From:
Austin Hastings
Date:
January 22, 2004 13:31
Subject:
RE: Semantics of vector operations (Damian)
Message ID:
ICELKKFHGNOHCNCCCBKFCEKHCJAA.Austin_Hastings@Yahoo.com


> -----Original Message-----
> From: Luke Palmer [mailto:fibonaci@babylonia.flatirons.org]
> Sent: Thursday, January 22, 2004 3:52 PM
> To: Austin Hastings; Larry Wall; Language List
> Subject: Re: Semantics of vector operations (Damian)
> 
> 
> Jonathan Scott Duff writes:
> > On Thu, Jan 22, 2004 at 01:10:23PM -0500, Austin Hastings wrote:
> > > In reverse order:
> > > 
> > > >     %languageometer.values »+= rand;
> > > 
> > > This is the same as
> > > 
> > >      all( %languageometer.values ) += rand;
> > > 
> > > right?
> 
> Well, yes.  It's also the same as each of:
> 
>     any(  %languageometer.values ) += rand;
>     none( %languageometer.values ) += rand;
>     one(  %languageometer.values ) += rand;
> 
> Since the junctions aren't yet being evaluated in boolean context, the
> type of the junction doesn't matter. 

That is clear, once you've pointed it out, but really counterintuitive. Since all things are applicable, though, I don't object too much -- it's like "and" vs. "but" in English, I guess.


> Which is why making junctions applicable lvalues might be a bad idea.  I'm not sure, but this
> looks like a potential confuser.

I think I disagree. With the caveat that there may be something to be said for discriminating between assigning TO a junction variable and assigning THROUGH one, I think that the presence or absence of assignment-operators is still the (obvious, sufficient) indicator that an assignment is taking place.

   all(%languageometer.values) + 6

doesn't look like (and shouldn't be) an assignment.

  all(%languageometer.values) += 6;

does.

> > It's the same as 
> > 
> > 	$r = rand;
> > 	$_ += $r for %languageometer.values
> > 
> > Your junction looks like it should work but I think you're really
> > adding the random number to the junction, not the elements that compose
> > the junction thus none of %languageometer.values are modified.
> 
> Hmm... that depends on whether junctions hold references, or what they
> do in lvalue context, and a whole bunch of other, undecided things.
> 
> > > And is this
> > > 
> > > >     %languageometer.values »+=« rand;
> > > 
> > > the same as
> > > 
> > >     all( %languageometer.values ) += one( rand );
> 
> No, what you just wrote is the same as:
> 
>     all( %languageometer.values ) += rand;

So the vectorization op is providing the "call once per element" distribution service.
Which takes vectorization out of the MTOWTDI category and into the somewhat-orthogonal functionality category.

       Vectorized operator:  %languageometer.values      »+=« rand;  

       Vectorized "sides":   %languageometer.values      »+=« rand;  
  Alt. Vectorized "sides":   all(%languageometer.values)  +=« rand;

       Vectorized operands:  »%languageometer.values«     += »rand«;
  Alt. Vectorized operands:  all(%languageometer.values)  += »rand«;

I withdraw my aesthetic objection: if vectorizing the operator isn't going to work, I don't like *any* of them very much. 

> > I don't think so.  It's like:
> > 
> > 	$_ += rand for %languageometer.values
> 
> Sortof.  I think Larry was implying that rand returned an infinite list
> of random numbers in list context.  If not, then what he said was wrong,
> because it would be sick to say that:
> 
>     (1,2,3,4,5) »+« foo()
> 
> Calls foo() 5 times.

Why would it be sick, and in what context? 

With Larry's new "vectorized sides" suggestion, putting a guillemot on the right side of the operator vectorizes the right side operand, which *should* call foo() five times.

     (1,2,3,4,5) »+  foo()   # do { my $x=foo(); (1+$x, 2+$x, 3+$x, 4+$x, 5+$x); }
     (1,2,3,4,5) »+« foo()   # (1+foo(), 2+foo(), 3+foo(), 4+foo(), 5+foo())
     (1,2,3,4,5)  +« foo()   # Maybe the same as above? What does infix:+(@list,$scalar) do?
     (1,2,3,4,5)  +  foo()   # foo() in list context? What does infix:+(@list, @list2) do?

=Austin


Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About