Raku 6.e support
What the 6.e language revision changes about 6.d, and whether Raku++ changes it too. Turn it on with use v6.e.PREVIEW; as the first statement — in Rakudo and in Raku++ alike.
use v6.e.PREVIEW3on by default in Raku++, pragma or notEach entry is one snippet run four times — both engines under both revisions — because "does Raku++ do this?" and "does the pragma turn it on?" are different questions. Raku++ describes itself as implementing 6.d with 6.e features, and the fourth row is where that shows: a good deal of 6.e is simply on, pragma or not. The verdict scores the 6.e column against Rakudo's; the 6.d column is there so nobody ports code on a wrong assumption.
Every output is a real run, not a prediction: Rakudo 2026.07 and Raku++ (rakupp) 3.5.1 — a Raku interpreter and compiler in C++, measured 2026-08-20. The verdict follows one rule — Full when Raku++ gives what Rakudo gives under 6.e, or refuses what 6.e refuses; Not implemented when Raku++ says the thing does not exist; Divergent when it runs and answers something else. Partial is the one verdict set by hand, because "there, but not all the way there" is a judgement no comparison of outputs can make. The prose version of all this, with the reasoning and the sources, is What Raku 6.e adds to 6.d.
New syntax
Spellings the 6.d grammar rejects outright.
prefix //Full
Shorthand for .defined; in 6.d, // opens an empty regex.
say //42, " ", //Any;| Rakudo 6.d | Null regex not allowed. Please use .comb if you wanted to produce a | sequence of characters from a string. |
|---|---|
| Rakudo 6.e | True False |
| Raku++ 6.d | (no output) |
| Raku++ 6.e | True False |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
term nanoFull
The POSIX time in nanoseconds, as an Int, next to time and now.
say nano ~~ Int;| Rakudo 6.d | Expected a term, but found either infix ~~ or redundant prefix ~ | (to suppress this message, please use a … |
|---|---|
| Rakudo 6.e | True |
| Raku++ 6.d | Undefined routine 'nano' |
| Raku++ 6.e | True |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
q:o / q:format literalsFull
A compile-time sprintf template that is a callable Format object. Needs Rakudo's RakuAST frontend as well as 6.e.
my $f := q:o/%5s/; say $f.^name; say $f("foo");| Rakudo 6.d | Unrecognized adverb: :o | ------> my $f := q<HERE>:o/%5s/; say $f.^name; say $f("foo"); |
|---|---|
| Rakudo 6.e | Format | foo |
| Raku++ 6.d | ===SORRY!=== Parse error at line 1: Unrecognized adverb ':o' (a Format literal needs 6.e; `use v6.e.PREVIEW`) |
| Raku++ 6.e | Format | foo |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Rakudo needs its RakuAST frontend for this one (RAKUDO_RAKUAST=1); Raku++ does not.
the RakuAST:: packageNot implemented
Available without a pragma from 6.e; under 6.d it needs use experimental :rakuast.
say RakuAST::IntLiteral.new(42).DEPARSE;| Rakudo 6.d | Use of RakuAST is experimental; please 'use experimental :rakuast;' | ------> say RakuAST::<HERE>IntLiteral… |
|---|---|
| Rakudo 6.e | 42 |
| Raku++ 6.d | Undeclared name 'RakuAST::IntLiteral' |
| Raku++ 6.e | Undeclared name 'RakuAST::IntLiteral' |
slipped multislice @a[||@i]Full
A list of indices spliced into a multi-dimensional subscript.
my @a = [[1,2],[3,4]],; my @i = 0,1,0; say @a[||@i];| Rakudo 6.d | ([[1 2] [3 4]] (Any) [[1 2] [3 4]]) |
|---|---|
| Rakudo 6.e | 3 |
| Raku++ 6.d | ([[1 2] [3 4]] (Any) [[1 2] [3 4]]) |
| Raku++ 6.e | 3 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
hash hyperslice %h{**}Full
Every leaf of a nested associative, at any depth.
my %h = A => { B => 1, C => 2 }, D => 3; say %h{**}:k.sort.join(",");| Rakudo 6.d | (no output) |
|---|---|
| Rakudo 6.e | B,C,D |
| Raku++ 6.d | (no output) |
| Raku++ 6.e | B,C,D |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
hash multislice %h<a;b>Full
One value, not a one-element list as in 6.d.
my %h = A => { B => 42 }; say %h{'A';'B'};| Rakudo 6.d | (42) |
|---|---|
| Rakudo 6.e | 42 |
| Raku++ 6.d | (42) |
| Raku++ 6.e | 42 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
unit sub foo;Full
The semicolon form, for any sub rather than only MAIN — but it must be unit-scoped. Nothing prints: the rest of the file is the sub's body.
unit sub foo;
say "compiled";| Rakudo 6.d | A unit-scoped sub definition is not allowed except on a MAIN sub; | Please use the block form. If you did n… |
|---|---|
| Rakudo 6.e | (no output) |
| Raku++ 6.d | ===SORRY!=== Parse error at line 1: A unit-scoped sub is only allowed for MAIN before 6.e; use the block fo… |
| Raku++ 6.e | (no output) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
New subs, terms and operators
Added to CORE by src/core.e/additions.rakumod.
rotor as a subFull
The cycle comes first, the list last.
say rotor(2, 1..6); say rotor(2, 1, 1..6);| Rakudo 6.d | Undeclared routine: |
|---|---|
| Rakudo 6.e | ((1 2) (3 4) (5 6)) | ((1 2) (3) (4 5) (6)) |
| Raku++ 6.d | Undefined routine 'rotor' |
| Raku++ 6.e | ((1 2) (3 4) (5 6)) | ((1 2) (3) (4 5) (6)) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
snip as a subFull
Split a list where a predicate stops holding.
say snip(* < 3, 1,2,3,4);| Rakudo 6.d | Undeclared routine: |
|---|---|
| Rakudo 6.e | ((1 2) (3 4)) |
| Raku++ 6.d | Undefined routine 'snip' |
| Raku++ 6.e | ((1 2) (3 4)) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
snitch as a subFull
Note a value in passing and return it unchanged — a print(1) that does not disturb the expression.
my $x = snitch("hi"); say $x;| Rakudo 6.d | Undeclared routine: |
|---|---|
| Rakudo 6.e | hi | hi |
| Raku++ 6.d | Undefined routine 'snitch' |
| Raku++ 6.e | hi | hi |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
trans as a subFull
For use in feed operators.
say trans("a" => "b", "banana");| Rakudo 6.d | Undeclared routine: |
|---|---|
| Rakudo 6.e | bbnbnb |
| Raku++ 6.d | Undefined routine 'trans' |
| Raku++ 6.e | bbnbnb |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
comb with a PairFull
size => step, the way rotor takes it.
say comb(2 => 1, "abcdef");| Rakudo 6.d | Cannot resolve caller comb(Pair:D, Str:D); none of these signatures matches: | (Regex $matcher, $input, $li… |
|---|---|
| Rakudo 6.e | (ab de) |
| Raku++ 6.d | Cannot resolve caller comb(Str: Pair); the Pair form of comb arrived with 6.e |
| Raku++ 6.e | (ab de) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
next with a valueFull
The value becomes the result of that iteration.
say (1,2,3).map({ $_ == 2 ?? next(42) !! $_ }).List;| Rakudo 6.d | Calling next(Int) will never work with any of these multi signatures: | ------> say (1,2,3).map({ $_ == 2 ?… |
|---|---|
| Rakudo 6.e | (1 42 3) |
| Raku++ 6.d | (1 3) |
| Raku++ 6.e | (1 42 3) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
last with a valueFull
Same, and it is the final element produced.
say (1,2,3).map({ $_ == 2 ?? last(99) !! $_ }).List;| Rakudo 6.d | Calling last(Int) will never work with any of these multi signatures: | ------> say (1,2,3).map({ $_ == 2 ?… |
|---|---|
| Rakudo 6.e | (1 99) |
| Raku++ 6.d | (1) |
| Raku++ 6.e | (1 99) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
New methods
Augmented onto existing core classes by src/core.e/Fixups.rakumod.
.snipFull
On Any and on Supply.
say (1,2,3,4,5).snip(* < 3);| Rakudo 6.d | No such method 'snip' for invocant of type 'List'. Did you mean any of | these: 'Slip', 'skip', 'flip', 'sin'? |
|---|---|
| Rakudo 6.e | ((1 2) (3 4 5)) |
| Raku++ 6.d | No such method 'snip' for invocant of type 'List' |
| Raku++ 6.e | ((1 2) (3 4 5)) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
.snitchFull
Notes to $*ERR by default; takes a snitcher of your own.
my $x = (1,2).snitch; say $x.List;| Rakudo 6.d | No such method 'snitch' for invocant of type 'List' |
|---|---|
| Rakudo 6.e | (1 2) | (1 2) |
| Raku++ 6.d | No such method 'snitch' for invocant of type 'List' |
| Raku++ 6.e | (1 2) | (1 2) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
.skip with a listFull
Alternates produce N, skip N — .skip(2,3) keeps the first two and drops the next three.
say (1..10).skip(2,3).List;| Rakudo 6.d | Cannot resolve caller skip(Range:D: Int:D, Int:D); none of these signatures matches: | ($:: *%_) |
|---|---|
| Rakudo 6.e | (1 2 6 7 8 9 10) |
| Raku++ 6.d | Cannot resolve caller skip(Range: Int, Int); the list form of skip arrived with 6.e |
| Raku++ 6.e | (1 2 6 7 8 9 10) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
.nomarkFull
The string with every mark stripped from its graphemes.
say "élan vitál".nomark;| Rakudo 6.d | No such method 'nomark' for string 'élan vitál' |
|---|---|
| Rakudo 6.e | elan vital |
| Raku++ 6.d | No such method 'nomark' for invocant of type 'Str' |
| Raku++ 6.e | elan vital |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
IO::Path.stemFull
The basename without extensions — all of them, or the last N.
say "foo.tar.gz".IO.stem, " ", "foo.tar.gz".IO.stem(1);| Rakudo 6.d | No such method 'stem' for invocant of type 'IO::Path'. Did you mean any | of these: 'item', 'SPEC', 'Seq', … |
|---|---|
| Rakudo 6.e | foo foo.tar |
| Raku++ 6.d | No such method 'stem' for invocant of type 'IO::Path' |
| Raku++ 6.e | foo foo.tar |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Complex.signFull
v / |v| — the unit complex number. In 6.d, .sign throws on a non-real.
say (3+4i).sign;| Rakudo 6.d | Cannot convert 3+4i to Real: imaginary part not zero |
|---|---|
| Rakudo 6.e | 0.6+0.8i |
| Raku++ 6.d | Complex is not in the Real domain, so it has no sign |
| Raku++ 6.e | 0.6+0.8i |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Int.roll / Int.pickFull
42.pick(3) is short for (^42).pick(3).
say 6.roll ~~ Int, " ", 6.pick(3).elems;| Rakudo 6.d | True 1 |
|---|---|
| Rakudo 6.e | True 3 |
| Raku++ 6.d | True 1 |
| Raku++ 6.e | True 3 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Mu.Callable($name)Full
The method of that name, or a Failure — a findable method reference.
say 42.Callable("Str") ~~ Method;| Rakudo 6.d | No such method 'Callable' for invocant of type 'Int' |
|---|---|
| Rakudo 6.e | True |
| Raku++ 6.d | No such method 'Callable' for invocant of type 'Int' |
| Raku++ 6.e | True |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Str.comb with a PairFull
The method form of the same size => step combing.
say "abcdef".comb(2 => 1);| Rakudo 6.d | Cannot resolve caller comb(Str:D: Pair:D); none of these signatures matches: | (Cool:D $:: *%_ --> Seq:D) |
|---|---|
| Rakudo 6.e | (ab de) |
| Raku++ 6.d | Cannot resolve caller comb(Str: Pair); the Pair form of comb arrived with 6.e |
| Raku++ 6.e | (ab de) |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
:smartcase on the Str searchesFull
Case-insensitive unless the needle itself has a capital. On contains, starts-with, ends-with, index, indices, rindex, substr-eq.
say "Hello World".contains("world", :smartcase), " ", "Hello World".contains("World", :smartcase);| Rakudo 6.d | False True |
|---|---|
| Rakudo 6.e | True True |
| Raku++ 6.d | False True |
| Raku++ 6.e | True True |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
.fmt with a FormatFull
Added to Bag, BagHash, List, Map, Mix, MixHash, Pair, Seq, Set and SetHash.
say (1,2,3).fmt(q:o/%3d/);| Rakudo 6.d | Unrecognized adverb: :o | ------> say (1,2,3).fmt(q<HERE>:o/%3d/); |
|---|---|
| Rakudo 6.e | 1 2 3 |
| Raku++ 6.d | ===SORRY!=== Parse error at line 1: Unrecognized adverb ':o' (a Format literal needs 6.e; `use v6.e.PREVIEW`) |
| Raku++ 6.e | 1 2 3 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Rakudo needs its RakuAST frontend for this one (RAKUDO_RAKUAST=1); Raku++ does not.
Date.DateTime(:timezone)Full
The named argument is honoured; in 6.d it is silently dropped.
say Date.new(2026,1,1).DateTime(:timezone(3600)).timezone;| Rakudo 6.d | 0 |
|---|---|
| Rakudo 6.e | 3600 |
| Raku++ 6.d | 0 |
| Raku++ 6.e | 3600 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Instant.DateTime(:timezone)Full
The same fix on Instant.
say Instant.from-posix(0).DateTime(:timezone(3600)).timezone;| Rakudo 6.d | 0 |
|---|---|
| Rakudo 6.e | 3600 |
| Raku++ 6.d | 0 |
| Raku++ 6.e | 3600 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Changed behaviour
Same program, different answer. These are the ones to read before turning 6.e on for code that already works.
sqrt of a negative IntFull
A Complex rather than NaN.
say (-4).sqrt;| Rakudo 6.d | NaN |
|---|---|
| Rakudo 6.e | 0+2i |
| Raku++ 6.d | NaN |
| Raku++ 6.e | 0+2i |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
sqrt of a negative NumFull
The same fix on the floating-point side.
say (-4e0).sqrt;| Rakudo 6.d | NaN |
|---|---|
| Rakudo 6.e | 0+2i |
| Raku++ 6.d | NaN |
| Raku++ 6.e | 0+2i |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
log of a negative NumFull
The complex logarithm rather than NaN.
say (-1e0).log;| Rakudo 6.d | NaN |
|---|---|
| Rakudo 6.e | 0+3.141592653589793i |
| Raku++ 6.d | NaN |
| Raku++ 6.e | 0+3.141592653589793i |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Range.BoolFull
Emptiness, not "has endpoints".
say so (5..1), " ", so ("b".."a");| Rakudo 6.d | True True |
|---|---|
| Rakudo 6.e | False False |
| Raku++ 6.d | True True |
| Raku++ 6.e | False False |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
string ranges iterate by .succFull
6.d walks a per-position cross product, which is why ("az".."bc") has 52 elements there.
say ("az".."bc").join(",");| Rakudo 6.d | az,ay,ax,aw,av,au,at,as,ar,aq,ap,ao,an,am,al,ak,aj,ai,ah,ag,af,ae,ad,ac,bz,by,bx,bw,bv,bu,bt,bs,br,bq,bp,bo… |
|---|---|
| Rakudo 6.e | az,ba,bb,bc |
| Raku++ 6.d | az,ba,bb,bc |
| Raku++ 6.e | az,ba,bb,bc |
Raku++ does this without the pragma too — under 6.d, where Rakudo still does the old thing.
sprintf: sign before the prefixFull
C puts the minus first for every base.
say sprintf("%#x", -256);| Rakudo 6.d | 0x-100 |
|---|---|
| Rakudo 6.e | -0x100 |
| Raku++ 6.d | 0x-100 |
| Raku++ 6.e | -0x100 |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
sprintf: + and space no longer apply to %bFull
A binary conversion has no sign to decorate.
say sprintf("[%+b][% b]", 5, 5);| Rakudo 6.d | [+101][ 101] |
|---|---|
| Rakudo 6.e | [101][101] |
| Raku++ 6.d | [+101][ 101] |
| Raku++ 6.e | [101][101] |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
sprintf: # on a floatFull
Forces the decimal point, as in C.
say sprintf("[%#.0f]", 1);| Rakudo 6.d | [1] |
|---|---|
| Rakudo 6.e | [1.] |
| Raku++ 6.d | [1] |
| Raku++ 6.e | [1.] |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
sprintf: %G upper-cases NaNFull
And only %G — %g keeps the Raku spelling.
say sprintf("[%G][%g]", NaN, NaN);| Rakudo 6.d | [NaN][NaN] |
|---|---|
| Rakudo 6.e | [NAN][NaN] |
| Raku++ 6.d | [NaN][NaN] |
| Raku++ 6.e | [NAN][NaN] |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
a role's submethods are not composedFull
BUILD, TWEAK and DESTROY still run — 6.e adds them to the buildplan explicitly — but a role submethod is no longer callable as a method on the class.
role R { submethod s { 42 } }; class C does R { }; say C.new.s;| Rakudo 6.d | 42 |
|---|---|
| Rakudo 6.e | No such method 's' for invocant of type 'C'. Did you mean 'so'? |
| Raku++ 6.d | 42 |
| Raku++ 6.e | No such method 's' for invocant of type 'C' |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
a package no longer replaces its namesakeFull
class A::B inside module A::B nests instead of silently overwriting the outer stash.
module A::B { class A::B { } }; say A::B::A::B.^name;| Rakudo 6.d | Potential difficulties: | Declaring class 'A::B' inside an enclosing module of the same name |
|---|---|
| Rakudo 6.e | A::B::A::B |
| Raku++ 6.d | A::B::A::B |
| Raku++ 6.e | A::B::A::B |
Raku++ does this without the pragma too — under 6.d, where Rakudo still does the old thing.
shaped hashes default to MuFull
The value type of my %h{Str} with no explicit type.
my %h{Str}; say %h<nope>.WHAT.^name;| Rakudo 6.d | Any |
|---|---|
| Rakudo 6.e | Mu |
| Raku++ 6.d | Any |
| Raku++ 6.e | Mu |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
@_ is per-blockFull
Every block gets its own implicit *@_ instead of reaching for the enclosing routine's.
sub f(*@_) { my &c = { @_.elems }; say c(1,2,3) }; f(7,7,7,7);| Rakudo 6.d | Too many positionals passed; expected 0 or 1 arguments but got 3 |
|---|---|
| Rakudo 6.e | 3 |
| Raku++ 6.d | 3 |
| Raku++ 6.e | 3 |
Raku++ does this without the pragma too — under 6.d, where Rakudo still does the old thing.
pseudo-packages fail on a missing symbolFull
A Failure instead of Nil, so the mistake is not silent.
my $r = MY::<$nosuchvar>; say $r.^name;| Rakudo 6.d | Any |
|---|---|
| Rakudo 6.e | Failure |
| Raku++ 6.d | Any |
| Raku++ 6.e | Failure |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
LEXICAL:: rejects a dynamicFull
A $*variable is not a lexical, and asking for one through LEXICAL:: now says so.
my $*dyn = 42; sub f { say LEXICAL::<$*dyn> }; f;| Rakudo 6.d | 42 |
|---|---|
| Rakudo 6.e | Cannot access '$*dyn' through LEXICAL, because it is not declared as lexical |
| Raku++ 6.d | 42 |
| Raku++ 6.e | Cannot access '$*dyn' through LEXICAL, because it is not declared as lexical |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Grammar.parse fails instead of returning NilFull
6.e gives grammars a new base class whose failed parse carries an X::Syntax::Confused with the position.
grammar G { token TOP { \d+ } }; my $r = G.parse("abc"); say $r.^name;| Rakudo 6.d | Any |
|---|---|
| Rakudo 6.e | Failure |
| Raku++ 6.d | Any |
| Raku++ 6.e | Failure |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
splice can insert an itemized array wholeFull
A $[…] argument goes in as one element rather than being flattened.
my @a = 1,2,3; @a.splice(1,1,$[8,9]); say @a.raku;| Rakudo 6.d | [1, 8, 9, 3] |
|---|---|
| Rakudo 6.e | [1, [8, 9], 3] |
| Raku++ 6.d | [1, 8, 9, 3] |
| Raku++ 6.e | [1, [8, 9], 3] |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
a subset records its language versionFull
Even.^ver reports the revision it was declared under.
subset Even of Int where * %% 2; say Even.^ver;| Rakudo 6.d | 6.d |
|---|---|
| Rakudo 6.e | 6.e |
| Raku++ 6.d | 6.d |
| Raku++ 6.e | 6.e |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
New errors
Accepted and ignored in 6.d; a compile-time error from 6.e.
unknown regex boundaryFull
Only <|w> and <|c> are boundaries; anything else was a silent no-op.
say so "abc" ~~ /<|f> abc/;| Rakudo 6.d | True |
|---|---|
| Rakudo 6.e | Unrecognized regex boundary '<|f>'. The known boundaries are '<|w>' (word) and '<|c>' (codepoint). | ------… |
| Raku++ 6.d | True |
| Raku++ 6.e | ===SORRY!=== Parse error at line 2: Unrecognized regex boundary '<|f>'. The known boundaries are '<|w>' (wo… |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
experimental macrosFull
Not carried into 6.e.
use experimental :macros; macro m() { quasi { 42 } }; say m();| Rakudo 6.d | 42 |
|---|---|
| Rakudo 6.e | Experimental macros are no longer supported in Raku 6.e. | ------> use experimental :macros; macro<HERE> m(… |
| Raku++ 6.d | Undefined routine 'm' |
| Raku++ 6.e | Undefined routine 'm' |
Both refuse the program, but Raku++ has no macros under any revision, so what it reports is a parse error rather than the 6.e diagnostic.
sub foo; without unitFull
6.d rejects the semicolon form for anything but MAIN; 6.e allows any sub, but demands unit scope.
sub foo;
say "compiled";| Rakudo 6.d | A unit-scoped sub definition is not allowed except on a MAIN sub; | Please use the block form. If you did n… |
|---|---|
| Rakudo 6.e | Semicolon form of 'sub' without 'unit' is illegal. You probably want to use 'unit sub' | ------> sub foo;<H… |
| Raku++ 6.d | ===SORRY!=== Parse error at line 1: Semicolon form of 'sub' without unit scope is illegal. You probably wan… |
| Raku++ 6.e | ===SORRY!=== Parse error at line 2: Semicolon form of 'sub' without unit scope is illegal. You probably wan… |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
Deprecations and removals
The only things 6.e takes away.
.pm is no longer a module extensionFull
CompUnit::Repository::FileSystem looks for .rakumod and .pm6 only.
use OldMod; hi;| Rakudo 6.d | from .pm | Saw 1 occurrence of deprecated code. |
|---|---|
| Rakudo 6.e | Could not find OldMod in: |
| Raku++ 6.d | from .pm |
| Raku++ 6.e | Could not find OldMod in: | lib |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.
single-path unlink / rmdir / chmod / chownFull
One path in, one Bool out; the multi-path forms still work but are deprecated.
say unlink("/tmp/no-such-file-abc123").raku;| Rakudo 6.d | ["/tmp/no-such-file-abc123"] |
|---|---|
| Rakudo 6.e | Bool::True |
| Raku++ 6.d | ["/tmp/no-such-file-abc123"] |
| Raku++ 6.e | Bool::True |
Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.