Beefy Boxes and Bandwidth Generously Provided by pair Networks
Welcome to the Monastery
 
PerlMonks  

Re: RFC: "assignary" operator ?= : ( source Filter::PPI::Transform )

by Anonymous Monk
on Dec 11, 2019 at 06:29 UTC ( [id://11109957]=note: print w/replies, xml ) Need Help??


in reply to RFC: "assignary" operator ?= :

Source filter?

Should be easy with PPI something...

PPI::Document PPI::Statement PPI::Token::Symbol '$foo' PPI::Token::Whitespace ' ' PPI::Token::Operator '?' ################## PPI::Token::Operator '=' ################## PPI::Token::Whitespace ' ' PPI::Token::Symbol '$bar' PPI::Token::Whitespace ' ' PPI::Token::Operator ':' ################## PPI::Token::Whitespace ' ' PPI::Token::Symbol '$baz' PPI::Token::Structure ';' PPI::Token::Whitespace '\n' PPI::Statement PPI::Token::Symbol '$foo' PPI::Token::Whitespace ' ' PPI::Token::Operator '?' ################## PPI::Token::Operator '=' ################## PPI::Token::Whitespace ' ' PPI::Structure::List ( ... ) PPI::Token::Whitespace ' ' PPI::Statement::Expression PPI::Token::Word 'rand' PPI::Structure::List ( ... ) PPI::Token::Whitespace ' ' PPI::Token::Whitespace ' ' PPI::Token::Operator ':' ################## PPI::Token::Whitespace ' ' PPI::Structure::List ( ... ) PPI::Token::Whitespace ' ' PPI::Statement::Expression PPI::Token::Symbol '$baz' PPI::Token::Whitespace ' ' PPI::Token::Structure ';' PPI::Token::Whitespace '\n'

Filter::PPI::Transform - Tiny adapter module from PPI::Transform to source filter
PPI::Transform
PPI::Transform::UpdateCopyright - Demonstration PPI::Transform class
PPI-Transform-Sequence-v0.0.3
Tiny binder to combine multiple PPI::Transform objects 12 Nov 2012 13:43:39 GMT
Perl-Squish-1.06
Reduce Perl code to a few characters as possible 08 Apr 2009 11:07:41 GMT
  • Comment on Re: RFC: "assignary" operator ?= : ( source Filter::PPI::Transform )
  • Download Code

Replies are listed 'Best First'.
Re^2: RFC: "assignary" operator ?= : ( source Filter::PPI::Transform )
by LanX (Saint) on Dec 11, 2019 at 11:44 UTC

      Good luck implementing an infix operator with that.

      (I've tried.)

        > Good luck implementing an infix

        I wouldn't try to do this.

        Function like operators are good enough for me.

        tass $bar => this, that;

        Trinitarian assign is a bad name though.

        See also a "slow" implementation here

        Cheers Rolf
        (addicted to the Perl Programming Language :)
        Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

Re^2: RFC: "assignary" operator ?= : ( use Filter::PPI::Transform 'PPI::Transform::ConditionalAssignment'; )
by Anonymous Monk on Dec 11, 2019 at 19:11 UTC

    Proof of concept

    #!/usr/bin/perl -- BEGIN{ package PPI::Transform::ConditionalAssignment; use strict; use warnings; use Params::Util qw{_STRING _INSTANCE}; use PPI::Transform (); use parent 'PPI::Transform'; our $VERSION = '0.1'; # VERSION sub document { my $self = shift; my $document = _INSTANCE(shift, 'PPI::Document') or return undef; my $elements = $document->find( sub { $_[1]->isa('PPI::Token::Operator') or return ''; $_[1]->content eq '?' or return ''; $_[1]->snext_sibling->isa('PPI::Token::Operator') or return '' +; $_[1]->snext_sibling->content eq '=' or return ''; return 1; } ); return undef unless defined $elements; return 0 unless $elements; my $changes = 0; foreach my $question ( @$elements ) { my $symbol = $question->sprevious_sibling->clone; my $equals = $question->snext_sibling; $equals->insert_after( $symbol ); $symbol->insert_after( $question->remove ); $changes++; } return $changes; } 1; $INC{'PPI/Transform/ConditionalAssignment.pm'}=__FILE__; } # BEGIN package main; use Filter::PPI::Transform 'PPI::Transform::ConditionalAssignment'; for my $foo ( 0 .. 1 ) { my $bar = $foo; $foo ?= 'one' : 'zero'; print "$foo\n"; $bar ?= ('one '.rand): ('zero '.rand); print "$bar\n"; } print "let me know " ? "should I stay" : "or should I go"; __END__ $ perl ppi-transform-conditional-assignment.pl zero zero 0.563323974609375 one one 0.086761474609375 should I stay

Log In?
Username:
Password:

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://11109957]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (3)
As of 2024-04-25 17:56 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found