Raku (Programmiersprache)

Raku
Camelia.svg
Camelia, das Raku -Maskottchen[1]
Paradigma Multi-Paradigma
Familie Perl
Entworfen von Larry Wall
Entwickler Raku Community
Erstmals erschienen 25. Dezember 2015; vor 6 Jahren
Stabile Version
6.D 'Diwali' ' [2] / 24. Oktober 2020; Vor 21 Monaten
Disziplin tippen Dynamisch, schrittweise
OS Plattformübergreifend
Lizenz GNU Allgemeine öffentliche Lizenz oder Künstlerische Lizenz 2
Dateiname -Erweiterungen .p6, .pm6, .pod6, .t6, .raku, .rakumod, .rakudoc, rakutest [3]
Webseite Raku.org
Haupt Implementierungen
Rakudo
Beeinflusst von
Perl, Rubin, Smalltalk, Haskell,[4] JavaScript
Beeinflusst
Perl,[5] Haskell,[5] Antlang

Raku ist ein Mitglied der Perl Familie von Programmiersprachen.[6] Früher bekannt als Perl 6Es wurde im Oktober 2019 umbenannt.[7][8] Raku führt Elemente vieler moderner und historischer Sprachen ein. Kompatibilität mit Perl war kein Ziel, obwohl a Kompatibilitätsmodus ist Teil der Spezifikation. Der Entwurfsprozess für Raku begann im Jahr 2000.

Geschichte

In Perl 6 haben wir beschlossen, dass es besser wäre, die Sprache zu beheben, als den Benutzer zu beheben.

-Larry Wall[9]

Der Raku -Designprozess wurde erstmals am 19. Juli 2000 am vierten Tag dieses Jahres angekündigt Perl -Konferenz,[10] durch Larry Wall in seinem Zustand der Zwiebel 2000 sich unterhalten.[11] Zu dieser Zeit waren die Hauptziele, "historische Warzen" aus der Sprache zu entfernen. "Einfache Dinge sollten einfach bleiben, harte Dinge sollten einfacher werden, und unmögliche Dinge sollten schwierig werden". eine allgemeine Bereinigung des internen Designs und Apis. Der Prozess begann mit einer Reihe von Anfragen nach Kommentaren oder "RFCS". Dieser Prozess war für alle Mitwirkenden offen und ließ keinen Aspekt der Sprache, der sich verändert hatte.[12]

Sobald der RFC -Prozess abgeschlossen war, wurde die Wall -Überprüfung und klassifizierte jede der erhaltenen 361 erhaltenen Anfragen. Anschließend begann er den Prozess, mehrere "Apokalypsen" zu schreiben, wobei er die ursprüngliche Bedeutung des Begriffs "enthüllt" unterhielt.[13] Während das ursprüngliche Ziel darin bestand, eine Apokalypse für jedes Kapitel von zu schreiben Programmierung perlEs wurde offensichtlich, dass, wie jede Apokalypse geschrieben wurde, frühere Apokalypsen durch spätere Veränderungen ungültig gemacht wurden. Aus diesem Grund wurde eine Reihe von Synopsen veröffentlicht, wobei jeder den Inhalt einer Apokalypse bezieht, jedoch mit allen nachfolgenden Änderungen, die in Aktualisierungen widerspiegeln. Heute wird die Raku -Spezifikation durch die "Braten" -Testsuite verwaltet.[14] während die Synopsen als historische Referenz aufbewahrt werden.[15]

Es gibt auch eine Reihe von Exegeses von geschrieben von Damian Conway Dies erklärt den Inhalt jeder Apokalypse in Bezug auf die praktische Verwendung. Jede Exegese besteht aus Code -Beispielen sowie die Diskussion der Verwendung und Auswirkungen der Beispiele.[16]

In der Entwicklung von Raku werden heute drei primäre Kommunikationsmethoden verwendet. Das erste ist der Raku IRC -Kanal an Libera Chat. Der zweite ist ein Satz von Mailinglisten an Die Perl FoundationServer bei Perl.org.[17] Das dritte ist das Git Quellcode -Repository veranstaltet bei https://github.com/raku.

Erstziele und Implikationen

Die in seiner ersten Rede vorgeschlagene Hauptzielmauer war die Entfernung historischer Warzen. Dazu gehörten die Verwirrung umgeben Sigil Verwendung für Behälter, die Mehrdeutigkeit zwischen den auswählen Funktionen und der syntaktische Einfluss von BareWord Dateihandles. Es gab viele andere Probleme, die Perl -Programmierer seit Jahren mit der Fixierung besprochen hatten, die in seiner Rede von Wall ausdrücklich angesprochen wurden.

Eine Implikation dieser Ziele war, dass Perl 6 nicht hätte Rückwärtskompatibilität mit der vorhandenen Perl -Codebasis. Dies bedeutete, dass ein Code, der korrekt von einem Perl 5 -Compiler interpretiert wurde, von einem Perl 6 -Compiler nicht akzeptiert wurde. Da die Rückwärtskompatibilität bei der Verbesserung der Software ein häufiges Ziel ist, mussten die Bruchänderungen in Perl 6 explizit angegeben werden. Die Unterscheidung zwischen Perl 5 und Perl 6 wurde so groß, dass Perl 6 schließlich in Raku umbenannt wurde.

Maskottchen

Larry Wall und Camelia

Die Sprachen Maskottchen ist "Camelia, der Raku -Bug".[1] Sie Name ist eine Anspielung auf das Kamelmaskottchen, das miteinander verbunden ist Perlund ihre Form in der Wortliebhaberstradition der Perl-Community ist ein Stück auf "Softwarefehler". Spiraldesigns, die in ihre Schmetterlingsflügel eingebettet sind, ähneln den Charakteren" p6 ", dem bevorzugten Spitznamen für Perl 6, und die Auge-Platzierung außerhalb der Center ist ein absichtliches Wortspiel für" Wall-Eyed ".[18]

Eines der Ziele hinter dem lebhaften und farbenfrohen Design des Logos war es, Frauenfeindlichkeit in der Gemeinde zu entmutigen und eine Gelegenheit für diejenigen von "männlicher Überzeugung" zu sein, ihre sensible Seite zu zeigen.[19]

Implementierungen

Ab 2017, nur der Rakudo Die Implementierung wird aktiv entwickelt. Es wird keine Implementierung als offizielle Raku -Umsetzung ausgewiesen. Vielmehr "ist Raku alles, was die offizielle Testsuite übergibt."[20]

Rakudo Perl 6[21][22] zielt auf eine Reihe virtueller Maschinen ab, wie z. Moarvm, das Java virtuelle Maschine, und JavaScript. Moarvm ist a virtuelle Maschine speziell für Rakudo gebaut[23] und die NQP Compiler Toolchain.[24] Es gibt eine Schicht zwischen Raku und den virtuellen Maschinen, die als nicht ganz Perl 6 oder NQP bezeichnet werden, was implementiert Raku regiert zum Parsen von Raku sowie einer Zusammenfassung Syntaxbaum und Backend-spezifisch Codegenerierung. Große Teile von Rakudo sind in Raku selbst oder in seiner Untergruppe NQP geschrieben. Rakudo ist kein vollständig SelbstversorgungsumsetzungEs gibt auch nicht konkrete Pläne, Rakudo zu einem Bootstrapping -Compiler zu machen.

Historische Implementierungen

Mops war eine erste Implementierung von Perl 6 geschrieben in Haskell. Mops war früher die am weitesten fortgeschrittene Implementierung von Perl 6, aber seit Mitte 2007 ruhte sie größtenteils (mit Updates, die nur zur Verfolgung der aktuellen Version von durchgeführt wurden GHC). Ab November 2014 wurde Mops nicht aktiv aufrechterhalten.[25]

Im Jahr 2007 wurden V6-Miniperl6 ("MP6") und seine Neuauflagen V6-Bindaperl6 ("KP6") als Mittel zum Bootstrap der Perl-6.0.0 STD unter Verwendung von Perl 5 geschrieben. Die STD ist eine volle Grammatik für Perl für Perl 6 und ist in Perl 6 geschrieben. Theoretisch ist alles, was den STD analysieren und ausführbarer Code generiert, ein geeignetes Bootstrapping -System für Perl 6. KP6 wird derzeit von MP6 zusammengestellt und kann mit mehreren Backends arbeiten.[26][27] MP6 und KP6 sind keine vollständigen Perl -6 -Implementierungen und sind nur so konzipiert, dass die Mindestfunktionen implementiert werden, die zum Bootstrap eines vollständigen Perl 6 -Compilers erforderlich sind.

Yapsi war ein Perl 6 -Compiler und Laufzeit in Perl 6 selbst. Infolgedessen erforderte es einen vorhandenen Perl 6 -Dolmetscher, wie beispielsweise eines der Rakudo -Star -Veröffentlichungen, um zu laufen.[28]

NieCza, ein weiterer wichtiger Perl 6 -Implementierungsaufwand, konzentrierte sich auf Optimierung und effiziente Implementierungsforschung. Es zielt auf die Gemeinsame Sprachinfrastruktur.[29]

Modulsystem

Die Raku -Spezifikation fordert das an Module mit Namen, Version und Autorität identifiziert werden.[30] Es ist möglich, nur eine bestimmte Version eines Moduls oder sogar zwei gleichnamige Module zu laden, die sich in der Version oder Autorität unterscheiden. Als Bequemlichkeit, Aliasing zu einem kurzen Namen wird bereitgestellt.

CPANDas Perl -Modulverteilungssystem verarbeitet noch keine RAKU -Module. Stattdessen wird ein Prototyp -Modulsystem verwendet.[31]

Hauptänderungen von Perl

Perl und Raku unterscheiden sich grundlegend, obwohl im Allgemeinen die Absicht war, "Raku Perl zu halten", so dass Raku eindeutig "eine Perl -Programmiersprache" ist. Die meisten Änderungen sollen die Sprache normalisieren, Anfänger und Expertenprogrammierern gleichermaßen erleichtern und "einfache Dinge einfacher und harte Dinge möglicher machen".

Eine Spezifikation

Ein wichtiger nicht-technischer Unterschied zwischen Perl und Raku besteht darin, dass Raku als Spezifikation begann.[20] Dies bedeutet, dass Raku bei Bedarf neu implementiert werden kann, und es bedeutet auch, dass Programmierer das nicht lesen müssen Quellcode für die ultimative Autorität für eine bestimmte Funktion. Im Gegensatz dazu wird in Perl die offizielle Dokumentation nicht als maßgeblich angesehen und beschreibt nur das Verhalten des tatsächlichen Perl -Dolmetschers informell. Alle Diskrepanzen zwischen der Dokumentation und der Implementierung können dazu führen, dass entweder geändert wird, um die andere widerzuspiegeln, eine Dynamik, die die kontinuierliche Entwicklung und Verfeinerung der Perl -Releases antreibt.

Ein Typsystem

In Raku die Dynamisches Typsystem von Perl wurde durch Zugabe von verstärkt Statische Typen.[32] Zum Beispiel:

mein Int $ i = 0;mein Ratte $ r = 3.142;mein Str $ s = "Hallo Welt";

Statische Typisierung bleibt jedoch übrig OptionalProgrammierer können also die meisten Dinge tun, ohne dass überhaupt ein explizites Tippen ist:

mein $ i = "25" + 10; # $ i ist 35 

Raku bietet a schrittweise Typisierung System, wobei der Programmierer möglicherweise die statische Eingabe verwenden, die dynamische Eingabe verwenden oder die beiden mischen.

Formale Unterprogrammeparameterlisten

Perl definiert Unterroutinen ohne formaler Parameter Listen überhaupt (obwohl die einfache Parameterzählung und eine Art Überprüfung mit Perls "Prototypen" durchgeführt werden können). In den Elementen des Arrays verabschiedeten Unterroutineargumente werden verabschiedet @_. Wenn die Elemente von @_ werden geändert, die Änderungen werden in den ursprünglichen Daten reflektiert.

Raku stellt die Sprache echte formale Parameter ein.[33] In Raku sieht eine Unterroutine -Erklärung so aus:

Sub etwas tun(Str $ Sache, Int $ andere) {...}

Wie in Perl sind die formalen Parameter (d. H. Die Variablen in der Parameterliste) Aliase zu den tatsächlichen Parametern (die in übergebenen Werte), aber standardmäßig sind die Aliase Konstante Sie können also nicht geändert werden. Sie können explizit als Read-Write-Aliase für den ursprünglichen Wert oder als Kopien verwenden ist rw oder ist Kopie Den Anweisungen sollte der Programmierer verlangt, dass er lokal geändert wird.

Parameterüberschreitungsmodi

Raku bietet drei grundlegende Modi des Parameterübergangs: Positionsparameter, Namens Parameterund Slurpy -Parameter.

Positionsparameter sind die typische geordnete Liste der Parameter, die die meisten Programmiersprachen verwenden. Alle Parameter können auch mit ihrem Namen auf ungeordnete Weise übergeben werden. Nur-benannte Parameter (angezeigt durch a : Bevor der Parametername) nur durch Angabe seines Namens übergeben werden kann, d. H. Er erfasst niemals ein Positionsargument. Slurpy -Parameter (angezeigt durch eine * vor dem Parameternamen) sind das Tool von Raku zum Erstellen Variadische Funktionen. Ein Slurpy-Hash wird verbleibende Parameter übergeben, während ein Slurpy-Array die verbleibenden Parameter für die Position erfasst.

Hier ist ein Beispiel für die Verwendung aller drei Parameter-Passing-Modi:

Sub etwas Funktion($ a, $ b:::$ c:::$ d, *@e) {...}etwas Funktion(1, 2:::d(3), 4, 5, 6); # $ A = 1, $ B = 2, $ d = 3, @e = (4,5,6) 

Positionsparameter, wie die oben genannten, sind immer erforderlich ? um anzuzeigen, dass sie optional sind. Die benannten Parameter sind standardmäßig optional, können jedoch nach Hinzufügen nach Bedarf gekennzeichnet werden ! Nach dem variablen Namen. Slurpy -Parameter sind stets Optional.

Blöcke und Schließungen

Parameter können auch an willkürliche Blöcke übergeben werden, die als als Schließungen. So zum Beispiel, wie, zum und während Loop -Iteratoren werden benannt. Im folgenden Beispiel wird eine Liste durchquert, 3 Elemente gleichzeitig und als die Variablen an den Block des Schleifens übergeben. $ a, $ b, $ c.[34]

zum @aufführen -> $ a, $ b, $ c {...}

Dies wird im Allgemeinen als "spitzes Sub" oder "spitze Block" bezeichnet, und der Pfeil verhält sich fast genau wie dem Sub Schlüsselwort, die einen anonymen Verschluss (oder eine anonyme Unterroutine in Perl -Terminologie) einführen.[33]

Sigil Invarianz

In Perl, Sigils - Die Interpunktionszeichen, die einem variablen Namen vorausgehen - ändern Sie sich je nachdem, wie die Variable verwendet wird:

# Perl Code my @array = ('a', 'b', 'c'); mein $ element = $Array [1]; # $ Element Equals 'B', mein @Extract = @Array [1, 2]; # @extract Equals ('B', 'C') mein $ element = @Array [1]; # 'B' wird mit einer Warnung (5.10 Option) geliefert

In Raku sind Sigils invariant, was bedeutet, dass sie sich nicht ändern, ob es sich um das Array oder das Array -Element handelt, das benötigt wird:[32]

# Raku Code my @array = 'a', 'b', 'c'; mein $ element = @Array [1]; # $ Element Equals 'B' my @Extract = @Array [1]; # @extract Equals ('B') my @Extract = @Array [1, 2]; # @extract Equals ('B', 'C')

Die Varianz in Perl ist durch die Anzahl der Zahlen in englischer Sprache und vielen anderen natürlichen Sprachen inspiriert:

"Dies Apple. " # $ a Richtig"Diese Äpfel. " # @a korrekt"Dies Dritter Apple. " # $ a [3] richtig"Diese Dritter Apple. " # @A [3] falsch

Diese konzeptionelle Zuordnung bricht jedoch bei der Verwendung zusammen Verweiseda sie sich auf Datenstrukturen beziehen, obwohl sie Skalare sind. Daher kann der Umgang mit verschachtelten Datenstrukturen in einem einzigen Begriff einen Ausdruck sowohl der Singular- als auch der Pluralform erfordern:

# Perl Code: Rufen Sie eine Liste aus dem Blatt eines Hashs mit Hashes ab, der Arrays enthält mein @trans_verbs = @{ $ Dictionary{ 'Verb' } { 'transitiv' } }; 

Diese Komplexität hat weder im gemeinsamen Gebrauch der natürlichen Sprache noch in anderen Programmiersprachen.[zweifelhaft ] Und es verursacht hoch kognitive Belastung beim Schreiben von Code, um komplexe Datenstrukturen zu manipulieren. Dies ist der gleiche Code in Raku:

# Raku Code: Rufen Sie eine Liste aus dem Blatt eines Hashs mit Hashes ab, der Arrays enthält mein @trans_verbs = %Wörterbuch <verb> <transitive> <>;

Objekt orientierte Programmierung

Perl unterstützt Objekt orientierte Programmierung über einen Mechanismus als bekannt als als Segen. Jede Referenz kann in ein Objekt einer bestimmten Klasse gesegnet werden. Ein gesegnetes Objekt kann haben Methoden Aufzurufen mit der "Pfeilsyntax", die dazu führt Subroutine Mit Namen und nennen Sie es mit der gesegneten Variablen als erstes Argument.

Obwohl es extrem leistungsfähig ist, ist es der häufigste Fall der Objektorientierung, a Struktur-ähnlich Objekt mit einem zugeordneten Code, unnötig schwierig. Darüber hinaus kann Perl keine Annahmen über die treffen können Objektmodell Bei Verwendung kann der Methodenaufruf nicht sehr gut optimiert werden.

Im Geiste, die "einfachen Dinge leicht und harte Dinge möglich" zu machen, behält Raku das Segensmodell und liefert ein robusteres Objektmodell für die gemeinsamen Fälle.[35] Zum Beispiel eine Klasse, um a zu verkapulieren Kartesischer Punkt Könnte auf diese Weise definiert und verwendet werden:

Klasse Punkt ist rw { hat $ .x; hat $ .y; Methode Distanz( Punkt $ p ) { sqrt(($! x - $ p.x) ** 2 + ($! y - $ p.y) ** 2)} Methode Entfernung zu Center { selbst.Distanz: Punkt.Neu(x => 0, y => 0)}}mein $ Punkt = Punkt.Neu( x => 1.2, y => -3.7 );sagen "Point's Standort: (", $ Punkt.x, ',', $ Punkt.y, ')';# Ausgabe: Punkte Standort: (1.2, -3.7) # X und y ändern (Hinweismethoden "x" und "Y", die als Lvalues ​​verwendet werden): $ Punkt.x = 3;$ Punkt.y = 4;sagen "Point's Standort: (", $ Punkt.x, ',', $ Punkt.y, ')';# Ausgabe: Punkte Standort: (3, 4) mein $ other point = Punkt.Neu(x => -5, y => 10);$ Punkt.Distanz($ other point); #=> 10 $ Punkt.Entfernung zu Center; #=> 5 

Der Punkt ersetzt den Pfeil in einer Anspielung auf die vielen anderen Sprachen (z. C ++, Java, Pythonusw.), die sich als Syntax für den Methodenaufruf um DOT zusammengetan haben.

In der Terminologie von Raku, $ .x wird als "Attribut" bezeichnet. Einige Sprachen nennen diese Felder oder Mitglieder. Die Methode zum Zugriff auf ein Attribut wird als "Accessor" bezeichnet. Eine automatische Zugriffsmethode ist eine automatisch erstellte Methode und benannt nach dem Namen des Attributs als Methode x ist im obigen Beispiel. Diese Accessor -Funktionen geben den Wert des Attributs zurück. Wenn eine Klasse oder ein individuelles Attribut mit dem deklariert wird ist rw Modifikator (kurz für "Read/Write"), die Auto-Zugriffe können als neuer Wert übergeben werden, um das Attribut festzulegen, oder es kann direkt als als zugewiesen werden lvalue (wie im Beispiel). Auto-Accessoren können durch benutzerdefinierte Methoden ersetzt werden, sollte der Programmierer eine reichhaltigere Schnittstelle zu einem Attribut wünschen. Attribute können nur direkt aus einer Klassendefinition über die zugegriffen werden $! Syntax unabhängig davon, wie die Attribute deklariert werden. Alle anderen Zugriffs müssen die Accessor -Methoden durchlaufen.

Das Raku -Objektsystem hat das inspiriert Elch Framework, das viele OOP -Funktionen von Raku in Perl einführt.[Klarstellung erforderlich]

Vererbung, Rollen und Klassen

Die Vererbung ist die Technik, mit der ein Objekt oder Typ Code oder Definitionen vorhandenen Objekten oder Typen wiederverwenden kann. Ein Programmierer möchte beispielsweise möglicherweise einen Standardtyp haben, jedoch mit einem zusätzlichen Attribut. Die Vererbung in anderen Sprachen, wie z. B. Java, wird bereitgestellt, indem Klassen unter Klassen vorhandener Klassen bestehen.

Raku sorgt für Vererbung über Klassen, die den Klassen in anderen Sprachen und Rollen ähneln.

Rollen in Raku übernehmen die Funktion von Schnittstellen in Java, Mischungen in Ruby und Züge[36] in Php und in der Smalltalk Variante Quietschen. Diese sind ähnlich wie Klassen, bieten aber einen sichereren Zusammensetzungsmechanismus.[37] Diese werden verwendet, um Kompositionen auszuführen, wenn sie mit Klassen verwendet werden, anstatt zu ihrer hinzuzufügen Nachlass Kette. Rollen definieren nominelle Typen; Sie liefern semantische Namen für Verhaltenssammlungen und Zustandssammlungen. Der grundlegende Unterschied zwischen einer Rolle und einer Klasse besteht darin, dass Klassen instanziiert werden können; Rollen sind nicht.[38]

Obwohl sich die Rollen von den Klassen unterscheiden, ist es möglich, Raku -Code zu schreiben, der direkt eine Rolle instanziiert oder eine Rolle als Typobjekt verwendet. als wäre es eine Klasse.[39]

Im Wesentlichen ist eine Rolle ein Bündel von (möglicherweise abstrakten) Methoden und Attributen, die einer Klasse ohne Vererbung hinzugefügt werden können. Eine Rolle kann sogar einem einzelnen Objekt hinzugefügt werden; In diesem Fall erstellt Raku eine anonyme Unterklasse, fügt die Rolle der Unterklasse hinzu und ändert die Klasse des Objekts in die anonyme Unterklasse.

Zum Beispiel a Hund ist ein Säugetier weil Hunde bestimmte Eigenschaften von Säugetieren erben, wie z. Milchdrüsen und (durch die Eltern von Säugetier, Wirbeltier) a Rückgrat. Andererseits können Hunde auch eines von mehreren unterschiedlichen Verhaltensarten haben, und diese Verhaltensweisen können sich im Laufe der Zeit ändern. Zum Beispiel kann ein Hund a sein Haustier, a Streunend (Ein verlassenes Haustier erlangt Verhaltensweisen, um nicht mit einem Haustier verbunden zu sein) oder a Führen Für Blinde (Blindhunde werden ausgebildet, damit sie nicht als Blindhunde leben). Dies sind jedoch zusätzliche Verhaltensweisen, die einem Hund hinzugefügt werden können. Es ist auch möglich, diese Verhaltensweisen so zu beschreiben, dass sie beispielsweise auf andere Tiere angewendet werden können, a Katze Kann gleichermaßen ein Haustier oder ein Streuner sein. Daher unterscheiden sich Hund und Katze voneinander, während beide innerhalb des allgemeineren Kategorie -Säugetiers bleiben. Säugetier ist also eine Klasse, Hund und Katze sind Klassen, die vom Säugetier erben. Das Verhalten, das mit PET, Streuner und Leitfaden verbunden ist, sind jedoch Rollen, die den Klassen oder Objekten aus Klassen instanziiert werden können.

Klasse Säugetier ist Wirbeltier {...}Klasse Hund ist Säugetier {...}Rolle Haustier {...}Rolle Streunend {...}Rolle Führen {...}

Rollen werden zu einer Klasse oder einem Objekt mit dem hinzugefügt tut Stichwort. Um Vererbung aus einer Klasse zu zeigen, gibt es ein anderes Schlüsselwort ist. Die Schlüsselwörter spiegeln die unterschiedlichen Bedeutungen der beiden Merkmale wider: Rollenzusammensetzung ergibt eine Klasse die Verhalten der Rolle, weist aber nicht an, dass es wirklich das ist gleiche Sache als die Rolle.

Klasse Blindenhund ist Hund tut Führen {...} # Unterklasse komponiert die Rolle mein $ Hund = Neu Hund;$ Hund tut Führen; # Einzelne Objekt komponiert die Rolle 

Obwohl sich die Rollen von Klassen unterscheiden, sind beide Typen, sodass eine Rolle in einer variablen Erklärung auftreten kann, in der normalerweise eine Klasse eingeben würde. Zum Beispiel könnte eine blinde Rolle für einen Menschen ein Attribut des Typ -Leitfadens enthalten. Dieses Attribut könnte einen Blindhund enthalten, a Führungspferd, ein Führer Mensch oder sogar eine Führungsmaschine.

Klasse Menschlich { hat Hund $ Hund; # Kann jede Art von Hund enthalten, ob es das tut     ... # Leitfadenrolle oder nicht }Rolle Blind { hat Führen $ Guide; # Kann jedes Objekt enthalten, das die Führungsrolle spielt.     ... # ob es sich um einen Hund oder etwas anderes handelt }

Reguläre Ausdrücke

Perl's regulären Ausdruck Die Support für die Verarbeitung von String war schon immer eines ihrer definierenden Funktionen.[40] Da haben die Konstrukte von Perl die Fähigkeiten von überschritten Regelmäßige Sprache Ausdrücke für einige Zeit,[41] Die Raku -Dokumentation wird sie ausschließlich als bezeichnen RegexesDistanzierung des Begriffs von der formalen Definition.

Raku bietet eine Superet von Perl -Funktionen in Bezug auf Regexes und faltet sie in ein größeres Gerüst, das genannt wird.Regeln"die die Fähigkeiten von bieten Kontextempfindlich Parsing Formalismen (wie die syntaktische Prädikate von Ausdrucksgrammatiken analysieren und Antlr) sowie als a Schließung in Bezug auf ihre lexikalischer Bereich.[42] Regeln werden mit dem eingeführt Regel Schlüsselwort, das eine Verwendung der Unterproutine -Definition sehr ähnlich ist. Anonyme Regeln können auch mit dem eingeführt werden Regex (oder rx) Schlüsselwort oder sie können einfach inline verwendet werden, da Regexps über die Perl in Perl waren m (passende) oder s (Ersatz) Operatoren.

Im Apokalypse 5, Larry Wall zählte 20 Probleme mit "aktueller Regex -Kultur" auf. Darunter waren Perls Regexes "zu kompakt und" süß "," zu viel Vertrauen in zu wenige Metacharaccters "," wenig Unterstützung für named Captures "," wenig Unterstützung für Grammatiker "und" schlechte Integration mit "Real" Sprache".[43]

Syntaktische Vereinfachung

Einige Perlkonstrukte wurden in Raku geändert, die für die häufigsten Fälle für verschiedene syntaktische Hinweise optimiert wurden. Zum Beispiel die Klammern (rund Klammern) erforderlich in Steuerfluss Konstrukte in Perl sind jetzt optional:[34]

wenn ist wahr() { zum @Array {...}}

Auch die , (Comma) Der Betreiber ist jetzt ein Listenkonstruktor, sodass bei Listen nicht mehr Klammern erforderlich sind. Der Code

@Array = 1, 2, 3, 4;

jetzt macht @Array ein Array mit genau den Elementen '1', '2', '3' und '4'.

Gekettete Vergleiche

Raku ermöglicht Vergleiche mit "Kette". Das heißt, eine Abfolge von Vergleiche wie die folgenden ist zulässig:

wenn 20 <= $ Temperatur <= 25 { sagen "Die Raumtemperatur liegt zwischen 20 und 25!" }

Dies wird so behandelt, als ob jeder Vergleich von links nach rechts allein durchgeführt würde, und das Ergebnis wird logisch über die kombiniert und Betrieb.

Faule Bewertung

Raku verwendet die Technik von faule Bewertung von Listen, die ein Merkmal einiger waren Funktionelle Programmierung Sprachen wie Haskell:[44]

@Integers = 0..Inf; # Ganzzahlen von 0 bis unendlich 

Der obige Code stürzt nicht ab, indem versucht wird, dem Array eine Liste der unendlichen Größe zuzuweisen @IntegersEs hängt auch nicht auf unbestimmte Zeit, um die Liste zu erweitern, wenn eine begrenzte Anzahl von Slots durchsucht wird.

Dies vereinfacht viele häufige Aufgaben in Raku, einschließlich Eingabe-/Ausgangsvorgängen, Listentransformationen und Parameterübergabe.

Versammeln

In Bezug auf die faule Bewertung ist die Konstruktion von faulen Listen mit Verwendung versammeln und nehmen, etwas wie Generatoren in Sprachen wie Verhalten Symbol oder Python.

mein $ Quadrate = faul versammeln zum 0..Inf { nehmen $ _ * $ _; };

$ Quadrate wird eine unendliche Liste von Quadratnummern sein, aber eine faule Bewertung der versammeln stellt sicher, dass Elemente nur berechnet werden, wenn sie zugegriffen werden.

Übergänge

Raku stellt das Konzept von vor Übergänge: Werte, die Verbundwerkstoffe anderer Werte sind.[44] In ihrer einfachsten Form werden Kreuzungen erstellt, indem eine Reihe von Werten mit Juncts kombiniert werden Betreiber:

# Beispiel für | ("Any") Junction: mein $ Farbe = 'Weiß';wenn nicht $ Farbe Gl 'Weiß' | 'Schwarz' | 'grau' | 'grau' { sterben "Farbdruck nicht unterstützt \ n"; }# Beispiel für & ("All") Junction: mein $ Passwort = 'Geheimnis! 123';wenn $ Passwort ~~ /<: Alpha>// & / /<:digit>/ & /<:punct>/ {{ sagen "Ihr Passwort ist einigermaßen sicher"; }

| Zeigt einen Wert an, der der beiden Linken entspricht. oder rechte Argumente. & Zeigt einen Wert an, der sowohl seiner Linken gleich ist. und rechte Argumente. Diese Werte können in jedem Code verwendet werden, der einen Normalwert verwendet. Operationen, die auf einem Junction Act für alle Mitglieder der Junction gleichermaßen durchgeführt wurden, und kombinieren nach Angaben des Junctive -Operators. So, ("Apple" | "Banane") ~ "S" ergäbe "Äpfel" | "Bananen". Im Vergleich geben Übergänge ein einzelnes wahres oder falsches Ergebnis für den Vergleich zurück. "irgendein"Junctions gibt wahr, wenn der Vergleich für eines der Elemente der Kreuzung zutreffend ist."alle"Junctions geben zurück, wenn der Vergleich für alle Elemente der Kreuzung zutreffend ist.

Junctions können auch verwendet werden, um das Typsystem durch Einführung eines Stils von reicheren zu erweitern generische Programmierung Das ist auf Kreuzungen von Typen beschränkt:

Teilmenge Farbe von Irgendein wo RGB_COLOR | Cmyk_color;Sub get_tint(Farbe $ Farbe, Num $ Depazität) {...}

Makros

In Sprachen auf niedriger Ebene das Konzept von Makros ist aufgrund der weit verbreiteten Verwendung des C Präprozessor. Hochrangige Sprachen wie jedoch Lispeln Vordatiert C bei der Verwendung von Makros, die weitaus leistungsfähiger waren.[45] Es ist dieses Lisp-ähnliche Makrokonzept, das Raku nutzen wird.[33] Die Macht dieser Art von Makro beruht auf der Tatsache, dass es als hoher Ebene im Programm arbeitet Datenstruktur, anstatt als einfacher Text, und verfügt über die vollen Fähigkeiten der Programmiersprache.

Eine Raku -Makro -Definition sieht aus wie eine Unterprogramm- oder Methodendefinition und kann auf unvergleichlichen Zeichenfolgen arbeiten, eine Ast Darstellung von Code darstellen oder eine Kombination aus beiden. Eine Makrodefinition würde so aussehen:[46]

Makro hallo($ was) { Quasi { sagen "Hallo {{{{$ was}}}}" }; }

In diesem speziellen Beispiel ist das Makro nicht komplexer als eine textliche Substitution im C-Stil, aber da das Parsen des Makroparameters vor dem Makro auf dem Anrufcode stattfindet, wären diagnostische Nachrichten weitaus informativer. Da jedoch der Körper eines Makros bei ausgeführt wird Zeit kompilieren Jedes Mal, wenn es verwendet wird, viele Techniken von Optimierung kann beschäftigt werden. Es ist sogar möglich, komplexe Berechnungen aus daraus resultierenden Programmen zu beseitigen, indem die Arbeit bei Compile-Time ausgeführt wird.

Kennungen

In Perl können Identifikatornamen die ASCII -Alphanumeriker und Unterstriche verwenden, die auch in anderen Sprachen verfügbar sind. In Raku können die Alphanumeriker die meisten Unicode -Zeichen enthalten. Darüber hinaus können Bindestriche und Apostrophes verwendet werden (mit bestimmten Einschränkungen, z. B. nicht von einer Ziffer). Die Verwendung von Bindestrichen anstelle von Unterstrichen, um Wörter in einem Namen zu trennen, führt zu einem genannten Namensstil. "Kebab -Fall".

Beispiele

Hallo Welt

Das Hallo Weltprogramm ist ein gemeinsames Programm zur Einführung einer Sprache. In Raku ist Hello World:

sagen 'Hallo Welt';

- obwohl Es gibt mehr als einen Weg, dies zu tun.

Fakultät

Das Fakultät Funktion in Raku, auf verschiedene Arten definiert:

# Verwenden von Rekursion (mit `if \ else` construct) Sub Tatsache( Uint $ n -> Uint ) { wenn $ n == 0 { 1 } anders       { $ n * Tatsache($ n-1)}}# Verwenden von Rekursion (mit `if` als Anweisungsmodifikator) Sub Tatsache( Uint $ n -> Uint ) { Rückkehr 1 wenn $ n == 0; Rückkehr $ n * Tatsache($ n-1); }# Verwenden von Rekursion (mit `WOS" Konstrukt) Sub Tatsache( Uint $ n -> Uint ) { Wenn $ n == 0 { 1 } Ursprünglich      { $ n * Tatsache($ n-1)}}# Verwenden des ternären Operators Sub Tatsache( Uint $ n -> Uint ) { $ n == 0? 1!! $ n * Tatsache($ n-1)}# Verwenden Sie mehrere Versand Multi Tatsache(0) { 1 }Multi Tatsache( Uint $ n -> Uint ) { $ n * Tatsache($ n - 1)}# Verwenden des Reduktionsmetaoperators Sub Tatsache( Uint $ n -> Uint ) {[*] 1..$ n }# Erstellen eines faktoriellen Betreibers und Verwendung des Reduktionsmetaoperators Sub Postfix:( UInt $n --> Uint ) {[*] 1..$ n }# Verwenden Sie den Deklarator von "State", um ein memoisiertes Faktor zu erstellen Sub Tatsache( Uint $ n -> Uint ) { Zustand %bekannt = 0 => 1; Rückkehr %bekannt{$ n} wenn %bekannt{$ n}:existiert; %bekannt{$ n} = $ n * Tatsache($ n-1); Rückkehr %bekannt{$ n}; }

Schnelle Sorte

Schnelle Sorte ist ein bekannter Sortieralgorithmus. Eine funktionierende Implementierung[a] Die Verwendung des funktionalen Programmierparadigmas kann in Raku kurz und bündig geschrieben werden:

# Leere Liste Sortierungen zur leeren Liste Multi schnelle Sorte([]) {()}# Andernfalls extrahieren Sie den ersten Element als Pivot ... Multi schnelle Sorte[$ pivot, *@sich ausruhen]) { # Partition.  mein @Vor = @sich ausruhen.Grep(* Vor $ pivot); mein @nach  = @sich ausruhen.Grep(* nach $ pivot); # Sortieren Sie die Partitionen.  eben (schnelle Sorte(@Vor), $ pivot, schnelle Sorte(@nach))}
  1. ^ Sofern die Implementierung hinter den Kulissen nicht etwas Ausgefallenes und Geheimnisvolles tut, ist die maximal mögliche Rekursionstiefe die Länge der Liste, wodurch diese Implementierung für Big Data nicht geeignet ist. Rekursionstiefe kann beschränkt sein auf log2 (list_length) durch Iterieren in die größeren Partitionen Vor und nachund nur in die kleinere Partition aufzunehmen.

Turm von Hanoi

Turm von Hanoi wird oft verwendet, um eine rekursive Programmierung in Informatik einzuführen. Diese Implementierung verwendet den Multi-Dispatch-Mechanismus von Raku und parametrische Einschränkungen:

Multi Sub Hanoi(0, $, $, $) {} # Keine Festplatte, also mach nichts Multi Sub Hanoi($ n, $ a = 'EIN', $ b = 'B', $ c = 'C') { # Beginnen Sie mit $ n Disks und drei Pegs a, b, c  Hanoi $ n - 1, $ a, $ c, $ b; # Bewegen Sie zunächst Top $ n - 1 Scheiben von a nach b  sagen "Bewegen Sie die Festplatte $ n von Peg $ a bis peg $ c"; # Dann bewegen Sie die letzte Festplatte von a bis c  Hanoi $ n - 1, $ b, $ a, $ c; # Bewegen Sie zuletzt $ n - 1 Scheiben von B nach C. }

Bücher

In der Geschichte von Raku gab es zwei Wellen des Buchschreibens. Die erste Welle folgte der ersten Ankündigung von Perl 6 im Jahr 2000. Diese Bücher spiegeln den Zustand des Designs der Sprache dieser Zeit wider und enthalten meist veraltete Material. Die zweite Welle, die der Ankündigung von Version 1.0 im Jahr 2015 folgte, umfasst mehrere bereits veröffentlichte Bücher und einige andere, die gerade geschrieben werden.

Bücher, die vor Perl 6 Version 1.0 veröffentlicht wurden (bekannt als Version 6.C)

  • A. Randal, D. Sugalski, L. Totsch. Perl 6 und Papageien -Essentials, 1. Auflage, 2003, ISBN978-0596004996
  • A. Randal, D. Sugalski, L. Totsch. Perl 6 und Papageien -Essentials, Zweite Ausgabe 2004. ISBN978-0596007379
  • S. Walters. Perl 6 jetzt: Die Kernideen, die mit Perl 5 illustriert wurden. 2004. ISBN978-1590593950

Außerdem wurde 2009 ein Buch, das einem der ersten virtuellen Maschinen Perl 6 Virtual Machines, Parrot, gewidmet ist, gewidmet.

Bücher, die nach Perl 6 Version 1.0 veröffentlicht wurden (bekannt als Version 6.C)

Bücher, die mit dem neuen Raku -Namen veröffentlicht wurden

Bücher zu veröffentlicht

Es gibt ein paar Berichte[47] Von verschiedenen Autoren über die neuen Bücher, die in Kürze veröffentlicht werden, basieren alle auf der aktuellen Version 1.0 (bekannt als Version 6.C) von Perl 6.

Verweise

  1. ^ a b Jackson, Joab (23. Juli 2010). "Perl-Schöpfer weist auf eine unmittelbare Veröffentlichung von lang erwarteten Perl 6 hin.". IDG News Service. Abgerufen 8. Februar 2015.
  2. ^ http://blogs.perl.org/users/zoffix_znet/2018/11/announce-raku-perl-6-diwali-6d-language-specification-release.html
  3. ^ "Module".
  4. ^ "Glossar der Begriffe und Jargon". Perl Foundation Perl 6 Wiki. Die Perl Foundation. 28. Februar 2011. archiviert von das Original am 21. Januar 2012. Abgerufen 8. Februar 2015.
  5. ^ a b 唐鳳, a.k.a. Audrey Tang (21. April 2010). "Wie man Perl 6 in '10 implementiert".
  6. ^ "Über Perl". Perl.org. Abgerufen 11. Juni 2020. "Perl" ist eine Sprachenfamilie, "Raku" (früher bekannt als "Perl 6") ist Teil der Familie, aber es ist eine separate Sprache, die ein eigenes Entwicklungsteam hat. Seine Existenz hat keinen signifikanten Einfluss auf die kontinuierliche Entwicklung von "Perl".
  7. ^ "Perl 6 Umbenannt in Raku". Lwn.net. 15. Oktober 2019. Abgerufen 16. Oktober 2019.
  8. ^ "TPF -Antwort auf Raku umbenannt". 29. Oktober 2019.
  9. ^ Biancuzzi, Federico; Warden, Shane (2009). Masterminds der Programmierung: Gespräche mit den Schöpfer wichtiger Programmiersprachen. ISBN 978-0596515171.
  10. ^ Kline, Joe (21. August 2000). "Bericht aus der Perl -Konferenz".
  11. ^ Wand, Larry (2000). "Zustand der Zwiebel 2000". O'Reilly -Netzwerk.
  12. ^ Die Perl Foundation (2000). "Über Perl 6 RFCs".
  13. ^ Wall, Larry (2. April 2001). "Apokalypse 1: Das Hässliche, das Schlechte und das Gute".
  14. ^ "Raku Test Suite". GitHub. 2019.
  15. ^ Larry Wall und die Perl 6 Designer (2015). "Perl 6 Designdokumente".
  16. ^ Die Perl Foundation (2001). "Exegesses".
  17. ^ Die Perl Foundation (2002). "Perlentwicklung: Mailinglisten".
  18. ^ "Larry Wall im IRC -Chat -Protokoll". 15. Januar 2016. Abgerufen 10. November 2017.
  19. ^ "Archivierte" Logo -Überlegungen "E -Mail von Larry Wall". GitHub. 24. März 2009. Abgerufen 10. November 2017.
  20. ^ a b Wall, Larry (10. August 2004). "Synopsis 1: Übersicht".
  21. ^ "Rakudo/Rakudo - Github". Github.com. Abgerufen 21. September 2013.
  22. ^ Michaud, Patrick (16. Januar 2008). "Der Compiler, der früher als 'Perl6' bekannt war '". Archiviert von das Original am 18. Februar 2012.
  23. ^ Worthington, Jonathan (31. Mai 2013). "Moarvm: Eine virtuelle Maschine für NQP und Rakudo". 6guts. Abgerufen 24. Juli 2013.
  24. ^ "NQP - nicht ganz Perl bei Github". GitHub. 29. Mai 2022. Abgerufen 29. Mai 2022.
  25. ^ "Feature -Vergleich von Perl 6 Compilern". Archiviert von das Original am 7. Februar 2019.
  26. ^ Wand, Larry; et al. (2007). "Perl 6 std". GitHub.
  27. ^ "MP6/KP6 FAQ". Perl 6 Entwicklungsteam. 2006.
  28. ^ "Yapsi Readme". GitHub. 2011.
  29. ^ O'Rear, Stefan (29. November 2011). "NieCza Readme.Pod". GitHub. Abgerufen 12. Januar 2012.
  30. ^ Wall, Larry (2004). "Synopsis 11: Module".
  31. ^ "Perl 6 Module Verzeichnis". Modules.raku.org. Abgerufen 17. Mai 2020.
  32. ^ a b Wall, Larry (20. Mai 2009). "Synopsis 2: Bits und Stücke".
  33. ^ a b c Wall, Larry (21. März 2003). "Synopsis 6: Unterroutinen".
  34. ^ a b Wall, Larry (20. Mai 2009). "Synopsis 4: Blöcke und Aussagen".
  35. ^ Wall, Larry (18. August 2006). "Synopsis 12: Objekte".
  36. ^ Die Software -Kompositionsgruppe (2003). "Züge". Archiviert von das Original am 11. August 2006. Abgerufen 22. September 2006.
  37. ^ Worthington, Jonathan (2009). "Tag 18: Rollen".
  38. ^ chromatisch (2009). "Das Warum der Perl -Rollen".
  39. ^ "Objektorientierung". docs.raku.org. Abgerufen 24. Oktober 2019.
  40. ^ Parlante, Nick (2000). "Essential Perl: String -Verarbeitung mit regulären Ausdrücken".
  41. ^ Christiansen, Tom (1996). "Perl5 regulärer Ausdrucksbeschreibung". Archiviert von das Original am 31. März 2010. Abgerufen 25. März 2010. Perls Regexps "nicht" - das heißt, sie sind nicht "regelmäßig", weil auch Backreferen pro SED und Grep unterstützt werden, was die Sprache nicht mehr streng regelmäßig macht
  42. ^ Wall, Larry (20. Mai 2009). "Synopsis 5: Regexes und Regeln".
  43. ^ Wall, Larry (4. Juni 2002). "Apocalypse 5: Muster Matching".
  44. ^ a b Wall, Larry (13. September 2004). "Synopsis 9: Datenstrukturen".
  45. ^ Lamkins, David B. (8. Dezember 2004). Erfolgreiches Lisp: Wie man gemeinsames Lisps versteht und verwendet. BookFix.com. Archiviert von das Original am 12. September 2006. Abgerufen 13. September 2006.
  46. ^ "Makros".
  47. ^ Bücher über Perl 6

Externe Links