Skip to content


Subversion checkout URL

You can clone with
Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

82 lines (67 sloc) 2.265 kB
use v6;
use Test;
plan 23;
# L<S02/Names/"for the identifier of the variable">
sub foo() { $*VAR };
class CT {
method foo() { $*VAR }
method foo_priv { self!priv }
method !priv { $*VAR }
my $o =;
my $*VAR = 'one';
is $*VAR, 'one', 'basic contextual declaration works';
is foo(), 'one', 'called subroutine sees caller $*VAR';
is $, 'one', 'called method sees caller $*VAR';
is $o.foo_priv, 'one', 'called private method sees caller $*VAR';
is, 'one', 'called class method sees caller $*VAR';
is CT.foo_priv, 'one', 'called private class method sees caller $*VAR';
my $*VAR = 'two';
is $*VAR, 'two', 'inner contextual declaration works';
is foo(), 'two', 'inner caller hides outer caller';
is $, 'two', 'inner caller hides outer caller (method)';
is, 'two', 'inner caller hides outer caller (class method)';
is $o.foo_priv, 'two', 'inner caller hides outer caller (private method)';
is CT.foo_priv, 'two', 'inner caller hides outer caller (private class method)';
is foo(), 'one', 'back to seeing outer caller';
is $, 'one', 'back (method)';
is $o.foo_priv, 'one', 'back (private method)';
is, 'one', 'back (class method)';
is CT.foo_priv, 'one', 'back (private class method)';
nok foo().defined, 'contextual $*VAR is undefined';
sub a1() { @*AR; @*AR.join('|') };
my @*AR = <foo bar>;
is a1(), 'foo|bar', 'contextual @-variables work';
sub a2() { &*CC('a') };
my &*CC = -> $x { 'b' ~ $x };
is a2(), 'ba', 'contextual Callable variables work';
# no idea if it actually makes sense to put contextuals inside a package, but
# the lexical alias that's also created should work just fine:
# Notsomuch in niecza, as the "lexical alias" is only seen by the compiler...
sub f { $*a };
our $*a = 'h';
is f(), 'h', 'our $*a';
sub f { %*a };
our %*a = a => 'h';
is f().keys, 'a', 'our %*a';
#RT #63226
# Not every impl has an @*INC by default...
package Foo { our sub run() { return @*INC } };
ok Foo::run().chars > 0;
# vim: ft=perl6
Jump to Line
Something went wrong with that request. Please try again.