diff --git a/docs/ROADMAP b/docs/ROADMAP index 43301df28c7..c1aa6f0ffc2 100644 --- a/docs/ROADMAP +++ b/docs/ROADMAP @@ -35,7 +35,7 @@ Really important items 1 *** get the Advent examples running again (all) Ought to have items -2 ** basic Buf implementation (A) +2 ** basic Buf implementation (A, masak) 2 ** speed issues and profiling (C, all) 2 ** regex modifiers (B, pmichaud) 2 *** installation standards (A) diff --git a/src/Perl6/Grammar.pm b/src/Perl6/Grammar.pm index b879b19b277..13b6a89427c 100644 --- a/src/Perl6/Grammar.pm +++ b/src/Perl6/Grammar.pm @@ -1298,7 +1298,13 @@ token quote:sym { 'Q' <.ws> } token quote:sym { 'Q:PIR' <.ws> } token quote:sym { '/' \s* '/' <.panic: "Null regex not allowed"> } token quote:sym { '/''/' <.old_rx_mods>? } -token quote:sym { >> '/''/' <.old_rx_mods>? } +token quote:sym { + >> + [ + | '/''/' <.old_rx_mods>? + | '{''}' <.old_rx_mods>? + ] +} token quote:sym { >> [ diff --git a/src/builtins/assign.pir b/src/builtins/assign.pir index 462c9381bbc..146eb608443 100644 --- a/src/builtins/assign.pir +++ b/src/builtins/assign.pir @@ -85,6 +85,12 @@ src/builtins/assign.pir - assignment operations $P0 = find_lex '$opname' $S0 = $P0 $P0 = get_global $S0 + $P1 = a.'defined'() + if $P1 goto defined + $P2 = $P0() + $P1 = $P0($P2, b) + .tailcall '&infix:<=>'(a, $P1) + defined: $P1 = $P0(a, b) .tailcall '&infix:<=>'(a, $P1) .end diff --git a/src/core/Any-list.pm b/src/core/Any-list.pm index f8759c54a68..da8694c5f8c 100644 --- a/src/core/Any-list.pm +++ b/src/core/Any-list.pm @@ -6,6 +6,10 @@ augment class Any { pir::join__SsP($separator, self.list.eager); } + multi method elems() { + 1; + } + our multi method map(&block) { Q:PIR { .local pmc self, block, map diff --git a/src/core/Complex.pm b/src/core/Complex.pm index cdf0485fd3f..cae55101703 100644 --- a/src/core/Complex.pm +++ b/src/core/Complex.pm @@ -255,11 +255,11 @@ multi sub infix:<+>(Complex $a, Complex $b) { Complex.new($a.re + $b.re, $a.im + $b.im); } -multi sub infix:<+>(Complex $a, $b) { +multi sub infix:<+>(Complex $a, Real $b) { Complex.new($a.re + $b, $a.im); } -multi sub infix:<+>($a, Complex $b) { +multi sub infix:<+>(Real $a, Complex $b) { # Was $b + $a; but that trips a ng bug, and also means # that Num + Complex is slower than Complex + Num, which # seems daft. @@ -274,11 +274,11 @@ multi sub infix:<->(Complex $a, Complex $b) { Complex.new($a.re - $b.re, $a.im - $b.im); } -multi sub infix:<->(Complex $a, $b) { +multi sub infix:<->(Complex $a, Real $b) { Complex.new($a.re - $b, $a.im); } -multi sub infix:<->($a, Complex $b) { +multi sub infix:<->(Real $a, Complex $b) { Complex.new($a - $b.re, -$b.im); } @@ -286,11 +286,11 @@ multi sub infix:<*>(Complex $a, Complex $b) { Complex.new($a.re * $b.re - $a.im * $b.im, $a.im * $b.re + $a.re * $b.im); } -multi sub infix:<*>(Complex $a, $b) { +multi sub infix:<*>(Complex $a, Real $b) { Complex.new($a.re * $b, $a.im * $b); } -multi sub infix:<*>($a, Complex $b) { +multi sub infix:<*>(Real $a, Complex $b) { Complex.new($a * $b.re, $a * $b.im); } @@ -300,11 +300,11 @@ multi sub infix:(Complex $a, Complex $b) { ($a.im * $b.re - $a.re * $b.im) / $d); } -multi sub infix:(Complex $a, $b) { +multi sub infix:(Complex $a, Real $b) { Complex.new($a.re / $b, $a.im / $b); } -multi sub infix:($a, Complex $b) { +multi sub infix:(Real $a, Complex $b) { Complex.new($a, 0) / $b; } @@ -324,11 +324,11 @@ multi sub infix:<**>(Complex $a, Complex $b) { ($a.log * $b).exp; } -multi sub infix:<**>(Complex $a, $b) { +multi sub infix:<**>(Complex $a, Real $b) { ($a.log * $b).exp; } -multi sub infix:<**>($a, Complex $b) { +multi sub infix:<**>(Real $a, Complex $b) { ($a.log * $b).exp; } diff --git a/src/core/Cool-str.pm b/src/core/Cool-str.pm index abf42aeac9e..4445b2bb785 100644 --- a/src/core/Cool-str.pm +++ b/src/core/Cool-str.pm @@ -42,7 +42,12 @@ augment class Cool { my $c = 0; my $l = $limit ~~ ::Whatever ?? Inf !! $limit; gather while $l > 0 && (my $m = self.match($matcher, :c($c))) { - take $match ?? $m !! ~$m; + if $match { + my $m-clone = $m; + take $m-clone; + } else { + take ~$m; + } $c = $m.to == $c ?? $c + 1 !! $m.to; --$l; } @@ -72,7 +77,8 @@ augment class Cool { gather { while $l-- > 0 && (my $m = self.match($matcher, :c($c))) { take self.substr($c, $m.from - $c); - take $m if $all; + my $m-clone = $m; + take $m-clone if $all; $c = $m.to == $c ?? $c + 1 !! $m.to; } take self.substr($c); diff --git a/src/core/Real.pm b/src/core/Real.pm index 87dc57f5c2b..a9c3e7397a0 100644 --- a/src/core/Real.pm +++ b/src/core/Real.pm @@ -10,12 +10,12 @@ role Real does Numeric { } # Hmmm... should the second argument be Numeric for the next two? - method exp(Real $exponent: Real $base = e) { + method exp(Real $exponent: Numeric $base = e) { $base ** $exponent; } - method log(Real $x: Real $base = e) { - $x.Bridge.log($base.Bridge); + method log(Real $x: Numeric $base = e) { + $x.Bridge.log($base); } method sign(Real $x:) { @@ -98,6 +98,14 @@ multi sub infix:<->(Num $a, Num $b) { pir::sub__NNN($a, $b) } +multi sub infix:<*>(Real $a, Real $b) { + $a.Bridge * $b.Bridge; +} + +multi sub infix:<*>(Num $a, Num $b) { + pir::mul__NNN($a, $b) +} + multi sub infix:(Real $a, Real $b) { $a.Bridge / $b.Bridge; } diff --git a/src/core/metaops.pm b/src/core/metaops.pm index fe48ead5e7c..7fa39734058 100644 --- a/src/core/metaops.pm +++ b/src/core/metaops.pm @@ -179,7 +179,7 @@ our multi sub infix:<*>() { 1 } our multi sub infix:<+&>() { +^0 } our multi sub infix:<+>() { 0 } our multi sub infix:<->() { 0 } -#our multi sub infix:<~>() { '' } +our multi sub infix:<~>() { '' } our multi sub infix:<+|>() { 0 } our multi sub infix:<+^>() { 0 } our multi sub infix:<~|>() { '' } @@ -209,7 +209,7 @@ our multi sub infix:() { Bool::True } our multi sub infix:<||>() { Bool::False } our multi sub infix:() { Bool::False } #our multi sub infix:<^^>() { Bool::False } -#our multi sub infix:() { Any } +our multi sub infix:() { Any } #our multi sub infix:() { +Inf } #our multi sub infix:() { -Inf } #our multi sub infix:<=>() { Nil } diff --git a/src/core/operators.pm b/src/core/operators.pm index 52c8409d882..6c9cbbe9671 100644 --- a/src/core/operators.pm +++ b/src/core/operators.pm @@ -34,19 +34,19 @@ our multi sub prefix:<->($a) { } our multi sub infix:<+>($a, $b) { - pir::add__NNN($a, $b) + +$a + +$b; } our multi sub infix:<->($a, $b) { - pir::sub__NNN($a, $b) + +$a - +$b; } our multi sub infix:<*>($a, $b) { - pir::mul__NNN($a, $b) + +$a * +$b; } our multi sub infix:($a, $b) { - pir::div__NNN($a, $b) + +$a / +$b; } our multi sub infix:<%>($a, $b) { @@ -54,7 +54,7 @@ our multi sub infix:<%>($a, $b) { } our multi sub infix:<**>($a, $b) { - pir::pow__NNN($a, $b) + (+$a) ** +$b; # parenthesis needed because of precendence. } our multi sub infix:<&>(*@items) { diff --git a/tools/contributors.pl b/tools/contributors.pl index 287965a1564..54abdaf257b 100644 --- a/tools/contributors.pl +++ b/tools/contributors.pl @@ -21,7 +21,7 @@ while ($msg =~ /([^\s()]+)\+\+/g) { $contrib{nick_to_name($1)}++; } - while ($msg =~ /(couretsy by:?)\s*(\S.*)/i) { + while ($msg =~ /(courtesy by:?)\s*(\S.*)/i) { $contrib{nick_to_name($1)}++; } } @@ -67,7 +67,7 @@ sub nick_to_name_from_CREDITS { } } close $f; - use Data::Dumper; print Dumper \%nicks; + use Data::Dumper; $Data::Dumper::Sortkeys = 1; print Dumper \%nicks; return \%nicks; }