Hi,

I don't understand why the 2 following Perl6 programs give a different result 
when running.

If someone could give me an explanation, it will help me a lot. Many thanks.



(Note the 2 programs run on Linux and the Linux environment variable $toto is 
set to "totoenv". ( export toto=totenv )


Program1 :

cat test051.pl6

#!/opt/rakudo-star-2016.10/bin/perl6
use v6;

grammar TEST {
rule  TOP     { :i \s*  <varenv>  }
    token varenv {'$'<mot> }
    token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
}

class ActionsTest {
    method TOP ($/) { $/.make( ~%*ENV{$<varenv><mot>}); }
}

my $actions = ActionsTest.new;
my $script = "\$toto" ;
my $scr = TEST.parse($script,:$actions);
say $scr;
say $scr.made;
===> ./test051.pl6
?$toto?
 varenv => ?$toto?
  mot => ?toto?
totoenv
----------------
This programs runs fine and displayed the value for the toto environment 
variable.



Program2:

cat test052.pl6

grammar TEST {
rule  TOP     { :i \s*  <varenv>  }
    token varenv {'$'<mot> }
    token mot     { <[a..z A..Z 0..9 =\-_!~'():@&+$,\']>+ }
}

class ActionsTest {
    method varenv ($/) { $/.make( %*ENV{$<varenv><mot>}); }
    method TOP ($/) { $/.make( ~$/); }
}

my $actions = ActionsTest.new;
my $script = "\$toto" ;
my $scr = TEST.parse($script,:$actions);
say $scr;
say $scr.made;

===>
Use of Nil in string context
  in method varenv at ./test052.pl6 line 14
?$toto?
 varenv => ?$toto?
  mot => ?toto?
$toto
----------------
This program displays an error message and doesn't find the value of toto 
environment variable.


The only difference between the 2 programs is instruction "make( 
%*ENV{$<varenv><mot>}" is part of the TOP method in the program 1 and part of 
the varenv method in program 2.

I'm certainly missing something but I don't understand why program 2 doesn't 
work. I'm very interested to get explanations for that. It will help me to 
understand how to modify and AST using Perl6.


Thanks a lot for your help.

Best regards,

Jean-Pierre

Reply via email to