Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

118 lines (82 sloc) 2.675 kb
use v6;
use Test;
plan 12;
# L<S03/Item assignment precedence>
# Tests for rebinding subroutines themselves
{
my sub foo { 42 }
my sub bar { 41 }
is(foo(), 42, 'before sub redefinition');
&foo := &bar;
is(foo(), 41, 'after sub redefinition');
}
# Since regexes are methods, token redefinition should work the same way
package TokenTest {
token foo { <[ab]> }
token bar { <[ef]> }
my $target = 'cat';
my Bool $bool;
#?pugs todo
ok($bool = ($target ~~ m/<foo>/), 'before token redefinition');
&foo := &bar;
ok(not($bool = ($target ~~ m/<foo>/)), 'after token redefinition');
}
# Tests for binding the return value of subroutines (both as RHS and LHS).
{
my sub foo { 42 }
my $var := foo();
is $var, 42,
"binding a var to the return value of a sub (a constant) works (1)";
dies_ok { $var = 23 },
"binding a var to the return value of a sub (a constant) works (2)";
}
=begin unspecced
{
my sub foo { 42 }
dies_ok { foo() := 23 },
"using the constant return value of a sub as the LHS in a binding operation dies";
}
There're two ways one can argue:
* 42 is constant, and rebinding constants doesn't work, so foo() := 23 should
die.
* 42 is constant, but the implicit return() packs the constant 42 into a
readonly 42, and readonly may be rebound.
To clear the terminology,
42 # 42 is a constant
sub foo ($a) {...} # $a is a readonly
=end unspecced
{
my sub foo { my $var = 42; $var }
my $var := foo();
is $var, 42,
"binding a var to the return value of a sub (a variable) works (1)";
#?pugs todo
dies_ok { $var = 23 },
"binding a var to the return value of a sub (a variable) works (2)";
}
{
my sub foo is rw { my $var = 42; $var }
my $var := foo();
is $var, 42,
"binding a var to the return value of an 'is rw' sub (a variable) works (1)";
lives_ok { $var = 23 },
"binding a var to the return value of an 'is rw' sub (a variable) works (2)";
is $var, 23,
"binding a var to the return value of an 'is rw' sub (a variable) works (3)";
}
{
my sub foo is rw { my $var = 42; $var }
#?pugs todo 'bug'
lives_ok { foo() := 23 },
"using the variable return value of an 'is rw' sub as the LHS in a binding operation works";
}
=begin discussion
Should the constant return value be autopromoted to a var? Or should it stay a
constant?
{
my sub foo is rw { 42 }
dies_ok/lives_ok { foo() := 23 },
"using the constant return value of an 'is rw' sub as the LHS in a binding operation behaves correctly";
}
=end discussion
# vim: ft=perl6
Jump to Line
Something went wrong with that request. Please try again.