highlight.raku

    #!/usr/bin/perl6

    use v6;

    if True {
        say "Hello";
    }

    if True {
    say "Hello"; # Bad indentation intended
            }

    if True { say "Hello" }

    if True {say "Hello"}

    if True { say "Hello" } else { say "Goodbye" }; say "world";

    ## BEGIN Comments

    say 1 #`( blah TODO blah
    here? ) 2 ;
    say 1 #`{{ blah TODO blah
    here? }} 2 ;
    say 1 #`[[ blah TODO blah ]
    here? ]] 2 ;
    say 1 #`««« blah TODO blah
    here? »»» 2 ;
    say 1 #` ( blah TODO blah
    2 ;

    #`[
      This is another multi-line comment. ]
    my @sorted = @names.sort({ %sets{$_} }).sort({ %matches{$_} }).reverse;
    #`{ So is this, though it's not actually multi-line. }

    say 'code again';

    #`(  Multiple line comments `( sub-comment )`)`

    ## END Comments

    #`[
    And this is how a multi would work.
    That says why we do what we do below.
    ]

    say "No more";

    #`{{a}a}} say ok

    say "No more";

    say "this is code";

    =begin pod

    A very simple Pod6 document

    =end pod

    =begin head1
    Top Level Heading
    =end head1

    =head1 Top level heading

    =for head1
    Top Level Heading

    =cutsdads

    =begin pod

    =head1 This is a head1 title

    This is a paragraph.

    =head2 Subsection
    # plop
    Here some text for the subsection.

    =end pod

    =begin table :caption<My Tasks>
    mow lawn
    take out trash
    =end table

    =head1 This is a heading block
    This is an ordinary paragraph.
    Its text will be squeezed and
    short lines filled. It is terminated by
    the first blank line.

    =head2 This is another heading block
    This is yet another ordinary paragraph,
    at the first virtual column set by the
    previous directive

    #| Base class for magicians
    class Magician {
      has Int $.level;
      has Str @.spells;
    }

    #| Fight mechanics
    sub duel(Magician $a, Magician $b) {
    }
    #=«<((
     <Magicians only, no mortals. >
     Magicians only, no mortals.
    ))>»

    say Magician.WHY;

    #|<< This is an example of stringification:
        * Numbers turn into strings
     >   * Regexes operate on said strings
        * C<with> topicalizes and places result into $_
    >>
    sub search-in-seq( Int $end, Int $number ) {
        with (^$end).grep( /^$number/ ) {
            .say for $_<>;
        }
    }
    #= Uses     * topic    * decont operator

    =head1 plop
    abc

    =head1 plop
    =para
    abc

    =head1 plop
     abc
    abc

    =head1 plop
    abc

    say 1;

    =head1 plop

    say 1;

    =for head1
    plop

    =for table :conf[str, 'str', "str", 1, True] :conf(str, 'str', "str", 1, True)
    =for table :conf<str 'str' "str" 1 True>
    =for table :conf{k => str, k=>'str', k=>"str", k=>1, k=>True}
    =for table :a :!b :42k :+s
    abc

    say 2;

    =begin a
    abc
    =end a

    =begin b sa
    =end b
    say 2;

    =begin a
    abc

    abc

    abc
    =end a
    say 0 ;
    =begin a:config{42}
    abc

    =head1 The
    Title

    abc
    =end ab
    say 1 ;

    =begin b sa
    =end b
    =begin a
    abc
    =begin b
    abc
    =end b a
    abc

    abc
    =end a
    say 3 ;

    =item a
    =item b
    =begin code
     =item a
    =end code

    =begin code
     =item a
     b
    =end code d
    =end code

    =begin comment
    Here are several
    lines
    of comment
    =end comment

    =begin pod
    =head1 acB<<I<a>>>a B<c> U<d> BB<a>

    C<my $var = 1; say $var;>
    Perl 6 homepage L<https://perl6.org> L<Perl 6 homepage|https://perl6.org>
    Comments L<#Comments> L<Comments|#Comments>
    Perl 6 is awesome Z<Of course it is!>
    Perl 6 is multi-paradigmatic N<Supporting Procedural, Object Oriented, and Functional programming>
    Enter your name K<John Doe> E<0xBB> characters.

    A X<hash|hashes, definition of; associative arrays>

    =DISCLAIMER
    P<http://www.MegaGigaTeraPetaCorp.com/std/disclaimer.txt>

    A X<hash|hashes, definition of; associative arrays>
    is an unordered collection of scalar values indexed by their
    associated string key.

        my @names = <Foo Bar Baz>;
        my @upper-case-names = @names.map: { .uc }    # OUTPUT: [FOO BAR BAZ]

    =end pod

    =begin table :caption<My Tasks>
    mow lawn
    take out trash
    =end table

    =begin table :config{caption => "My Tasks"}
    mow lawn
    take out trash
    =end table

    say "\c999 \c999999999 \c[LATIN CAPITAL LETTER A, LATIN CAPITAL LETTER B] \c77s \c[77,22]";
    say "\x0 \x00 \x[0] \x[00] \x[f] \xaaa \xfffffff \xffh \x[ffff] \x[fffffff] \x[42,42]";
    say "\o0 \o00 \o[0] \o[00] \o[7] \o333 \o77777777 \o77h \o[333] \o[77777777] \o[42,42]";

    say Q[A literal string] ;
    say ｢More plainly.｣ ;
    say Q ^Almost any non-word character can be a delimiter!^ ;
    say Q ｢｢Delimiters can be repeated/nested if they are adjacent.｣｣ ;

    say Q (this is fine, because of space after Q) ;
    say Q 'and so is this' ;
    say Q<Make sure you <match> opening and closing delimiters> ;
    say Q{This is still a closing curly brace → \} ;

    say Q;yes, this is fine; ;
    say Q('this is a function') ;

    say 'Very plain';
    say q[This back\slash stays];
    say q[This back\\slash stays]; # Identical output
    say q{This is not a closing curly brace → \}, but this is → };
    say Q :q $There are no backslashes here, only lots of \$\$\$>!$;
    say '(Just kidding. There\'s no money in that string)';
    say 'No $interpolation {here}!';
    say Q:q!Just a literal "\n" here!;
    say Q:q[a\[]
    say Q[A literal string] ;
    say ｢More plainly.｣ ;
    say Q ^Almost any non-word character can be a delimiter!^ ;
    say Q ｢｢Delimiters can be repeated/nested if they are adjacent.｣｣ ;

    say qq[My favorite color is {$n+2}!];
    say qq{My favorite color\- is {$n+2}!};
    say Q:qq{My favorite color\- is {$n+2}!};
    say "My $color[0].uc(
    ) $n+$n.^name favorite color \q[1is] {$n+2}!abc&uc('a')";

    say qqww|a|;
    say qq:w:w|a|;
    say q:a:v|a|;

    say(qq:to/TERM INATOR/, 1+1);
     blah blah
     TERM INATOR

    my $don't-do-that = 1;
    my $piece_of_π = 3.14;
    my $駱駝道    = 1;
    my $lexical   = 1;
    my $*dynamic1 = 10;
    my $*dynamic2 = 100;

    sub say-all() {
        say "$lexical, $*dynamic1, $*dynamic2";
    }

    say-all();

    {
        my $lexical   = 2;
        my $*dynamic1 = 11;
        $*dynamic2    = 101;
    }

    my $square = 9 ** 2;
    my @array  = 1, 2, 3;   # Array variable with three elements
    my %hash   = London => 'UK', Berlin => 'Germany';

    class FailHash is Hash {
        has Bool $!final = False;
        multi method AT-KEY ( ::?CLASS:D: Str:D \key ){
            fail X::OutOfRange.new(:what("Hash key"), :got(key),
              :range(self.keys)) if $!final && !self.EXISTS-KEY(key);
            callsame
        }

        method finalize() {
            $!final = True
        }
    }

    my %h is FailHash = oranges => "round", bananas => "bendy";

    say %h<oranges>;
    %h.finalize;
    say %h<cherry>;
    CATCH { default { put .^name, ': ', .Str } }

    my ( @foo, $bar );
    @foo = ($bar) = 42, "str";

    say anon class þ {};
    say anon sub þ  { 42 };

    sub a {
        state @x;
        state $l = 'A';
        @x.push($l++);
    };

    say a for 1..6;

    sub foo($x) {
        my $v = @;
        $v[$x] = $x;
        say $v;
    }

    foo($_) for ^3;

    use MONKEY-TYPING;
    augment class Int {
        method is-answer { self == 42 }
    }
    say 42.is-answer;

    my $in = 0;

    sub f(*@c) {
        (temp $in)++;
         "<f>\n"
         ~ @c».indent($in).join("\n")
         ~ (+@c ?? "\n" !! "")
         ~ '</f>'
    };

    for <ab:c d$e fgh ij*> {
        .say if m/<-alpha>/;
    }

    for '.' {
        .Str.say when !.IO.d;
        .IO.dir()».&?BLOCK when .IO.d # lets recurse a little!
    }

    use Dog:auth<Somebody>:ver<2.0>;

    infix:<+>
    infix:<*>
    infix:«<=»

    postfix:<²>
    WOW:That'sAwesome
    WOW:That's<<🆒>>
    party:sweet<16>

    infix:<+>
    infix:<<+>>
    infix:«+»
    infix:['+']
    infix:('+')

    my $a:b<c>:d<e> = 100;
    my $a:d<e>:b<c> = 200;
    say $a:b<c>:d<e>;

    use Test; plan 1; constant &term:<👍> = &ok.assuming(True);
    👍

    my $x = do if True { 42 };

    say 1000000, 1_000_000, 10_00000, 100_00_00;
    say -2, 12345, 0xBEEF, 0o755, :3<1201>;
    say 1.0, 3.14159, -2.5, :3<21.0012>;
    say 1e0, 6.022e23, 1e-9, -2e48, 2e2i, .42;
    say 2.e2, .2, 0o39, 0xfF3u, 0oi, 0xi, :3<>, :23<gg ; # error

    for $size «[r/]« (2**60, 2**50, 2**40, 2**30, 2**20, 2**10)
              Z      <EB     PB     TB     GB     MB     KB> -> [\v,\suffix]

    my $a = 32;
    $a += 10;
    $a -= 2;
    $a = 3;
    $a min= 5;
    $s ~= 'b';

    sub infix:<space-concat> ($a, $b) { $a ~ " " ~ $b };
    my $a = 'word1';
    $a space-concat= 'word2';

    my Real $a = 1/2;
    $a = 3.14;
    $a .= round;

    my $a = True;
    say so $a != True;
    my $i = 10;

    my $release = Date.new(:2015year, :12month, :24day);
    my $today = Date.today;
    say so $release !before $today;

    say 4 R/ 12;
    say [R/] 2, 4, 16;
    say [RZ~] <1 2 3>,<4 5 6>

    say (1, 2, 3) »*» 2;
    say (1, 2, 3, 4) »~» <a b>;
    say (1, 2, 3) »+« (4, 5, 6);
    say (&sin, &cos, &sqrt)».(0.5);

    say @a »+=» 1;
    my ($a, $b, $c);
    (($a, $b), $c) «=» ((1, 2), 3);

    say !« @wisdom;
    @a»++;
    say -« [[1, 2], 3];

    @slops».?this-method-may-not-exist();

    my %outer = 1, 2, 3 Z=> <a b c>;
    my %inner = 1, 2 Z=> <x z>;
    say %outer «~» %inner;

    say $neighbors »>>+<<» ($p, *);

    sub plus { $^a + $^b };
    say [[&plus]] 1, 2, 3;

    my @n = [\~] 1..*;
    say @n[^5];

    @l = <a b c d> Z~ 1, 2, *;
    say so 1 S& 2 S& 3;
    @a X[+=] @b;
    multi sub postfix:<++>($x is rw) is assoc<non>
    say $filename++ for 1..3;
    $x % $y == $x - floor($x / $y) * $y
    say <a a b c a d> ⊍ bag(<a a b c c>);
    say -« <1 2 3>

    # This is wrong: creates a Hash of Mixes, not Mix:
    my Mix %mix;
    # Works with $ sigil:
    my Mix $mix;
    # Can be typed:
    my Mix[Int] $mix-of-ints;

    my $x;
    my $x = 7;
    my Int $x = 7;
    my Int:D $x = 7;
    ndef)
    my Int $x where { $_ > 3 } = 7;
    my Int $x where * > 3 = 7;

    $str ~~ tr:d:c!dol!wne!;
    $str ~~ TR:c/dol/wne/;
    $str ~~ s!foo!fox!;
    $str ~~ /foo/bar/;
    $str ~~ ///;
    $str ~~ rx/foo/bar/;
    $str ~~ Q :regex /foo/;
    $str ~~ s{b(.)r} = " d$0n";
    $str ~~ regex{fox}; # error
    $str ~~ regex {fox};
    rx/ ^ab /;
    / ^ ab /;
    rx/ \d ** 2/;
    $str ~~ tr:d:c!dol!wne!;
    $str ~~ TR:c/dol/wne/;
    $str ~~ s!foo!fox!;
    $str ~~ rx/foo/;
    $str ~~ regex:ds {fox};
    $str ~~ regex{fox};
    my a = /a/;
    rx/ ^ab /;
    a = / ^ ab 'a' "$a" \d \n\n <:L :Script<Latin>> <:Block('Basic Latin')>  /;
    //;
     rx:sigspace.\d+ < :Script +:Block "Basic Latin" + :L> #plop
    '-'.;
    rx/ \d ** 2 <[\d a d]+[\x233..\] " \c[dsds]]>/;
    say $str ~~ m:g/[(<[ACGT]> **: 3) \s*]+ \s+ (<[A..Z a a..z \s]>+)/;
    say '$333' ~~ m/^^ <?[$]> . \d+ /;
    say '/foo/o/bar/' ~~ /\/.**!{1..10}\//;
    rx(a);
    rx (a);
    $str ~~ regex {fox};
    $str ~~ s{b(.)r} = " d$0n";
    if 'abc' ~~ / [a||b] (c) / {
        say ~$0;                # OUTPUT: «c␤»
    }
    if 'abc' ~~ / $<myname> = [ \w+ ] / {
        say ~$<myname>      # OUTPUT: «abc␤»
    }
    say 'abc' ~~ / a <( b )> c/;
    say 'abc' ~~ / <(a <( b )> c)>/;
    say "abc" ~~ /a. | ab { print "win" } /;

    so 'hello world' ~~ m:Perl5/^hello (world)/;   # OUTPUT: «True␤»
    so 'hello world' ~~ m/^hello (world)/;         # OUTPUT: «False␤»
    so 'hello world' ~~ m/^ 'hello ' ('world')/;   # OUTPUT: «True␤»

    say "Abra abra CADABRA" ~~ m:exhaustive/:i a \w+ a/;

    my regex ipv4-octet { \d ** 1..3 <?{ $/.Int <= 255 && $/.Int >= 0 }> }
    my regex ipv4-octet { \d ** 1..3 <?{ True }> }
    say 'abc' ~~ / <?before a> && . /;
    say 'abcdefg' ~~ rx{ abc <[email protected]ending_letters> };
    s:g[\d+ <?before \s* @units>] = 5 * $/;

    sub walk(\thing, *@keys) is rw {
        my $current := thing;
        for @keys -> $k {
            if $k ~~ Int {
                $current := $current[$k];
            }
            else {
                $current := $current{$k};
            }
        }
        $current;
    }

    my %hash;
    walk(%hash, 'some', 'key', 1, 2) = 'autovivified';

    say %hash.perl;

    class X::WithoutLineNumber is X::AdHoc {
        multi method gist(X::WithoutLineNumber:D:) {
            $.payload
        }
    }
    die X::WithoutLineNumber.new(payload => "message")

    { return; CATCH { default { $*ERR.say: .^name, ': ', .Str } } }

    multi sub trait_mod:<is>(Routine $r, :$export!)

    react {
        whenever signal(SIGINT) {
            say "goodbye";
            done
        }
    }

    signal(SIGINT).tap: { say "bye"; exit }; loop {}

    method base-repeating(Rational:D: Int:D() $base = 10)

    multi sub prefix:<-->($x is rw) is assoc<non>

    multi MAIN(Bool :$man) {
        run $*EXECUTABLE, '--doc', $*PROGRAM;
    }

    for $file.lines -> $line {
        next unless $line; # ignore any empty lines

        my ($pairing, $result) = $line.split(' | ');
        my ($p1, $p2)          = $pairing.words;
        my ($r1, $r2)          = $result.split(':');

        %sets{$p1} += $r1;
        %sets{$p2} += $r2;

        if $r1 > $r2 {
            %matches{$p1}++;
        } else {
            %matches{$p2}++;
        }
    }

    for @sorted -> $n {
        my $match-noun = %matches{$n} == 1 ?? 'match' !! 'matches';
        my $set-noun   = %sets{$n} == 1 ?? 'set' !! 'sets';
        say "$n has won %matches{$n} $match-noun and %sets{$n} $set-noun";
    }

    say "Math: { 1 + 2 }";

    my @people = <Luke Matthew Mark>;
    say "The synoptics are: {@people}";

    say "{%sets}";
    say "we have @flavors[0]";
    say "we have @flavors[]";
    say "we have @flavors.sort()";
    say "we have @flavors.sort.join(', ')";

    my @valid-players = $file.get.words;

    for $file.lines -> $line {
        my ($pairing, $result) = $line.split(' | ');
        my ($p1, $p2)          = $pairing.split(' ');
        if $p1 ∉ @valid-players {
            say "Warning: '$p1' is not on our list!";
        }
        if $p2 ∉ @valid-players {
            say "Warning: '$p2' is not on our list!";
        }
    }

    my @array = [ 'x', 'xx', 'xxx', 'o', 'oo', 'X', 'Y', 'Z' ];
    my @array = <  x    xx    xxx    o    oo    X    Y    Z  >;

    sub plus { $^a + $^b };
    say [[&plus]] 1, 2, 3;

    say [X~] (1, 2), <a b>;

    my @n = [\~] 1..*;
    say @n[^5];

    my @l = <a b c d> Z~ ':' xx *;
       @l = <a b c d> Z~ 1, 2, *;

    say so 1 S& 2 S& 3;

    say %color«cherry "$fruit"».raku
    say $a.:<++>;

    say 2 !(elem) (1, 2, 3);

    say $_ if /A/ ^ff^ /C/ for @list

    my @result;
    <people of earth>
        ==> map({ .tc })
        ==> my @caps; @caps   # also could wrap in parentheses instead
        ==> grep /<[PE]>/
        ==> sort()
        ==> @result;

    my @result
        <== sort()
        <== grep({ /<[PE]>/ })
        <== my @caps            # unlike ==>, there's no need for additional statement
        <== map({ .tc })
        <== <people of earth>;

    False and do { 42.say };
    3, do if 1 { 2 }  ;
    if 0 { say "no" } elsif False { say "NO" } else { say "yes" }
    $_ = 1; unless False -> $a { $a.say } ;
    when so $a { say 'a' }

    for 1..100 {
        when * %% 15 { say 'FizzBuzz' }
        when * %% 3  { say 'Fizz' }
        when * %% 5  { say 'Buzz' }
        default      { say $_ }
    }

    multi sub grab(**@a) { "grab $_".say for @a }
    multi sub grab(\a) {
        a ~~ Iterable and a.VAR !~~ Scalar ?? nextwith(|a) !! nextwith(a,)
    }

    for '.' {
        .Str.say when !.IO.d;
        .IO.dir()».&?BLOCK when .IO.d # lets recurse a little!
    }

    say a».(0.5); say a>>.(0.5); a.:<sa> ; a. sa :!False
    func <a b>

    if 'abc-abc-abc' ~~ / $<string>=( [ $<part>=[abc] ]* % '-' ) / {
        say ~$<string>;          # OUTPUT: «abc-abc-abc␤»
        say ~$<string><part>;    # OUTPUT: «abc abc abc␤»
        say ~$<string><part>[0]; # OUTPUT: «abc␤»
    }

    [«[«[«[+]»]»]»] <1 2 3 4>