> Date: 20 Jan 2003 20:30:07 -0000
> From: Smylers <[EMAIL PROTECTED]>
> 
> It seems that when chaining together functions, omitting C<< <~ >>
> operators gives the same result in the familiar Perl 5 standard
> function-call syntax:
> 
>   @foo = sort { ... } <~ map { ... } <~ grep { ... } <~ @bar;
>   @foo = sort { ... } map { ... } grep { ... } @bar;
> 
> Left-right pipelines make sense to me.  I'm not yet sure how much I'd
> use them, but there are times when I find it a little odd to have data
> flowing 'upstream' in code, and reversing this could be nifty.

Agreed.

> However right-left pipelines don't seem to add much to the language,
> while becoming something else to have to learn and/or explain.
> (Damian's explanation of what C<< <~ >> does to code seemed
> significantly more involved than that of C<< ~> >>.) 

It's simple:  it's a backwards dot.  The invocant goes on the right
and the method and arguments go on the left.

  $foo.bar($baz);
-or-
  bar $foo: $baz;

is the same as:

  bar $baz <~ $foo;

And you see now what this gives us.  It gives us the ability to place
the invocant (almost) anywhere we want:  On the left, in between, or
on the right.  I think it's fortunate that we can't put it between
arguments...

> And an alternative spelling for the assignment operator[*0] doesn't
> strike me as something Perl is really missing:
> 
>   $msg <~ 'Hello there';
>   $msg = 'Hello there';

Yeah, I didn't see much gain in this bit.  But it's an expectable
generalization from ~>.

> I realize that there's a symmetry between the two operators, but that
> isn't a convincing reason for having them both.  People are used to data
> flow in one direction; it seems reasonable only to have an operator when
> wanting to change this, to make it go in the opposite direction.
> 
> What benefit does C<< <~ >> bring to the language?

Again, it provides not just a "null operator" between to calls, but
rather a rewrite of method call syntax.  So:

  map {...} <~ grep {...} <~ @boing;

is not:

  map {...} grep {...} @boing;

But rather:

  @boing.map({...}).grep({...});

Which will be defined to mean the same thing, but in many cases this
won't be true.  Another example:

  print "Starting server\n"    <~ open "> $logfile";

The important thing is that it's starting the server, not that it's
writing that to the logfile.  

I personally think that this could add something to readability at
times.  Maybe not as much as ~>, but every once in a while.

Luke

Reply via email to