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.

50Full0Partial0Divergent1Not implemented51changes tracked
46gated on use v6.e.PREVIEW3on by default in Raku++, pragma or not

Each 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.dNull regex not allowed. Please use .comb if you wanted to produce a | sequence of characters from a string.
Rakudo 6.eTrue False
Raku++ 6.d(no output)
Raku++ 6.eTrue 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.dExpected a term, but found either infix ~~ or redundant prefix ~ | (to suppress this message, please use a …
Rakudo 6.eTrue
Raku++ 6.dUndefined routine 'nano'
Raku++ 6.eTrue

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.dUnrecognized adverb: :o | ------> my $f := q<HERE>:o/%5s/; say $f.^name; say $f("foo");
Rakudo 6.eFormat | 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.eFormat | 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.dUse of RakuAST is experimental; please 'use experimental :rakuast;' | ------> say RakuAST::<HERE>IntLiteral…
Rakudo 6.e42
Raku++ 6.dUndeclared name 'RakuAST::IntLiteral'
Raku++ 6.eUndeclared 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.e3
Raku++ 6.d([[1 2] [3 4]] (Any) [[1 2] [3 4]])
Raku++ 6.e3

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.eB,C,D
Raku++ 6.d(no output)
Raku++ 6.eB,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.e42
Raku++ 6.d(42)
Raku++ 6.e42

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.dA 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.dUndeclared routine:
Rakudo 6.e((1 2) (3 4) (5 6)) | ((1 2) (3) (4 5) (6))
Raku++ 6.dUndefined 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.dUndeclared routine:
Rakudo 6.e((1 2) (3 4))
Raku++ 6.dUndefined 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.dUndeclared routine:
Rakudo 6.ehi | hi
Raku++ 6.dUndefined routine 'snitch'
Raku++ 6.ehi | 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.dUndeclared routine:
Rakudo 6.ebbnbnb
Raku++ 6.dUndefined routine 'trans'
Raku++ 6.ebbnbnb

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.dCannot resolve caller comb(Pair:D, Str:D); none of these signatures matches: | (Regex $matcher, $input, $li…
Rakudo 6.e(ab de)
Raku++ 6.dCannot 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.dCalling 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.dCalling 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.dNo 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.dNo 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.dNo such method 'snitch' for invocant of type 'List'
Rakudo 6.e(1 2) | (1 2)
Raku++ 6.dNo 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.dCannot 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.dCannot 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.dNo such method 'nomark' for string 'élan vitál'
Rakudo 6.eelan vital
Raku++ 6.dNo such method 'nomark' for invocant of type 'Str'
Raku++ 6.eelan 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.dNo such method 'stem' for invocant of type 'IO::Path'. Did you mean any | of these: 'item', 'SPEC', 'Seq', …
Rakudo 6.efoo foo.tar
Raku++ 6.dNo such method 'stem' for invocant of type 'IO::Path'
Raku++ 6.efoo 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.dCannot convert 3+4i to Real: imaginary part not zero
Rakudo 6.e0.6+0.8i
Raku++ 6.dComplex is not in the Real domain, so it has no sign
Raku++ 6.e0.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.dTrue 1
Rakudo 6.eTrue 3
Raku++ 6.dTrue 1
Raku++ 6.eTrue 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.dNo such method 'Callable' for invocant of type 'Int'
Rakudo 6.eTrue
Raku++ 6.dNo such method 'Callable' for invocant of type 'Int'
Raku++ 6.eTrue

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.dCannot resolve caller comb(Str:D: Pair:D); none of these signatures matches: | (Cool:D $:: *%_ --> Seq:D)
Rakudo 6.e(ab de)
Raku++ 6.dCannot 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.dFalse True
Rakudo 6.eTrue True
Raku++ 6.dFalse True
Raku++ 6.eTrue 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.dUnrecognized adverb: :o | ------> say (1,2,3).fmt(q<HERE>:o/%3d/);
Rakudo 6.e1 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.e1 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.d0
Rakudo 6.e3600
Raku++ 6.d0
Raku++ 6.e3600

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.d0
Rakudo 6.e3600
Raku++ 6.d0
Raku++ 6.e3600

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.dNaN
Rakudo 6.e0+2i
Raku++ 6.dNaN
Raku++ 6.e0+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.dNaN
Rakudo 6.e0+2i
Raku++ 6.dNaN
Raku++ 6.e0+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.dNaN
Rakudo 6.e0+3.141592653589793i
Raku++ 6.dNaN
Raku++ 6.e0+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.dTrue True
Rakudo 6.eFalse False
Raku++ 6.dTrue True
Raku++ 6.eFalse 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.daz,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.eaz,ba,bb,bc
Raku++ 6.daz,ba,bb,bc
Raku++ 6.eaz,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.d0x-100
Rakudo 6.e-0x100
Raku++ 6.d0x-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.d42
Rakudo 6.eNo such method 's' for invocant of type 'C'. Did you mean 'so'?
Raku++ 6.d42
Raku++ 6.eNo 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.dPotential difficulties: | Declaring class 'A::B' inside an enclosing module of the same name
Rakudo 6.eA::B::A::B
Raku++ 6.dA::B::A::B
Raku++ 6.eA::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.dAny
Rakudo 6.eMu
Raku++ 6.dAny
Raku++ 6.eMu

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.dToo many positionals passed; expected 0 or 1 arguments but got 3
Rakudo 6.e3
Raku++ 6.d3
Raku++ 6.e3

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.dAny
Rakudo 6.eFailure
Raku++ 6.dAny
Raku++ 6.eFailure

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.d42
Rakudo 6.eCannot access '$*dyn' through LEXICAL, because it is not declared as lexical
Raku++ 6.d42
Raku++ 6.eCannot 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.dAny
Rakudo 6.eFailure
Raku++ 6.dAny
Raku++ 6.eFailure

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.d6.d
Rakudo 6.e6.e
Raku++ 6.d6.d
Raku++ 6.e6.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.dTrue
Rakudo 6.eUnrecognized regex boundary '<|f>'. The known boundaries are '<|w>' (word) and '<|c>' (codepoint). | ------…
Raku++ 6.dTrue
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.d42
Rakudo 6.eExperimental macros are no longer supported in Raku 6.e. | ------> use experimental :macros; macro<HERE> m(…
Raku++ 6.dUndefined routine 'm'
Raku++ 6.eUndefined 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.dA unit-scoped sub definition is not allowed except on a MAIN sub; | Please use the block form. If you did n…
Rakudo 6.eSemicolon 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.dfrom .pm | Saw 1 occurrence of deprecated code.
Rakudo 6.eCould not find OldMod in:
Raku++ 6.dfrom .pm
Raku++ 6.eCould not find OldMod in: | lib

Raku++ gates this on the pragma: without use v6.e.PREVIEW it does the 6.d thing.