Listings Breunung/Raku


Listing 1: Vererbung und Nutzung eines Attributes
use v6.d;

class Magazin    { has Str $.name }

class IX is Magazin {

    method new () { 
      self.bless( name => 'iX');
    }

    multi method title (Int $nr)   {
      "$.name Ausgabe $nr"
    }
    multi method title (Str $name) {
      "$.name Sonderausgabe $name"
    }
}

my $mag = Magazin.new( name => 'Make');
say $mag.name;       # gibt 'Make' aus
my $ix = IX.new();
say $ix.name;        # gibt 'iX' aus
say $ix.title(5);    # 'iX Ausgabe 5'
say $ix.title('Sprachen');
# 'iX Sonderausgabe Sprachen'

-------

Listing 2: Rolle implementieren und anwenden
role Summary {
    has @.article;
    method title ()   {...}
    method summary () { 
      say self.title;
      for @.article -> $article {
        say "$article.author - $article.title"
      }
    }
}

class IX is Magazin does Summary {
..
IX.new.summary; # gibt Zusammenfassung aus

-------

Listing 3: Typprüfungen während der Zuweisungen
my $höhe = 32;
say $höhe.WHAT;           # (Int)
$höhe = 'dreiundzwanzig'; # kein Typfehler
say $höhe.WHAT;           # (Str)
my Int $weite = '33';     # ! '33' ist Stringobjekt

-------

Listing 4: Parallele Auswertung zweier Dateien
use JSON::Tiny;

sub MAIN( $datei1, $datei2 ) {
    my $promise1 = start from-json( slurp( $datei1 ) );
    my $promise2 = start from-json( slurp( $datei2 ) );
    my ($inhalt1, $inhalt2) = await $promise1, $promise2;
    say $inhalt1 eqv $inhalt2 ?? 'Dateiinhalte identisch' !! 'Dateiinhalte verschieden';
}

-------

Listing 5: Asynchrone Dateiüberwachung mit zwei Supplies
my $rakuchange = supply { 
    whenever IO::Notification.watch-path($dir) -> $file {
      emit $file.path if $file.path ~~ /<.pm .p6> $/
    }
}
react {
    whenever $rakuchange -> $path { 
      say "Raku Datei $path geändert!"
    }
}

-------

Listing 6: Grammatik zum Einlesen von Potenzen in E-Notation
grammar Potenz {
    token TOP { <basis> <[eE]> <exponent> }
    token basis { <vorzeichen>? <zahl> ['.' <zahl> ]? }
    token exponent { <vorzeichen>? <zahl> }
    token vorzeichen { '+' | '-' }
    token zahl { \d+ }
}
my $fund = Potenz.parse('23.4E+2');

-------

Listing 7: Action-Klasse zur Berechnung des Zahlenwertes einer Potenz
class Calc {
    # reagiert auf die Regel TOP
    method TOP ($match)  {
      $match.make $match<basis>.Numeric * 10 ** $match<exponent>.Numeric 
    }
}
my $fund = Potenz.parse('23.4E+2', actions => Calc.new);
say $fund.Str;  # 23.4E+2
say $fund.made; # 2340