Ich werde nicht viel erklären, während ich gehe, und den Großteil davon bis zum Ende belassen.
Ich versuche herauszufinden, wie man eine Karte in einen Sink-Kontext wirft.
Das Hinzufügen --> Nil
als Rückgabewert des Blocks bewirkt Folgendes:
(1..3).map: -> $_ --> Nil { Sunk.new( :titanic($_) ) }
Die for
Schleife versenkt effektiv alle erstellten, die map
nicht.
Standardmäßig werden Blöcke ausgeführt mit:
Alle Aussagen bis auf die letzte im Senkenkontext.
Die letzte Aussage nicht im Senkenkontext. (Die letzte Anweisung ist der Rückgabewert des Blocks, daher wird angenommen, dass es unangemessen ist, ihn in die Spüle zu werfen.)
Ihr Code hat diese Standardeinstellung für Ihren map
Aufruf nicht geändert , sodass sich die letzte Anweisung des Blocks - seine einzige Anweisung - nicht im Senkenkontext befand. (Durch Hinzufügen --> Nil
zur Signatur des Blocks wird die letzte Anweisung wieder in den Senkenkontext versetzt.)
Ausnahmen von diesem Standardschema betreffen eine Art Anweisungsschlüsselwort. for
ist eine davon - es setzt seine Anweisung oder die letzte Anweisung in seinem Block in den Senkenkontext. (Um dies rückgängig zu machen, damit die letzte Anweisung nicht im Senkenkontext steht, können Sie so etwas schreiben $ = do for ...
.)
Dieser Test in Braten soll als Test dafür dienen. Und map
ist effektiv in einem Sink-Kontext, aber ich sehe nicht, wie es "als versunken laufen". Es läuft einfach.
Das entsprechende Ticket und der Test verwirren mich . Tut mir leid, ich kann hier nicht helfen.
Ich habe stundenlang nachgeforscht, um diese Antwort vorzubereiten. Einige der Stücke, die ich gefunden und auf die ich mich verlassen habe, folgen zusammen mit kurzen Notizen von mir.
Viele der folgenden Links führen zu bestimmten Zeilen von IRC-Protokollen. Meine Absicht für die meisten davon ist, dass Sie ein wenig des Dialogs lesen, der jeder Zeile folgt, um das zu maximieren, was Sie daraus erhalten (auch wenn es Verwirrung ist, weil ich denke, dass selbst das hilfreich sein könnte, wie ich als nächstes erkläre).
Bitte lesen Sie mindestens die folgenden Zusammenfassungen und klicken Sie auf einige der Links. Veröffentlichen Sie dann Kommentare unter dieser Antwort, um hier weitere Diskussionen anzuregen und zu prüfen, ob wir uns in Richtung Klarheit bewegen können.
Larry beginnt mit der Implementierung der Senkenbehandlung in STD (2010) . Vor allem enthalten, um den Punkt zu bestimmen, an dem er begann, das Senkenkonzept für Raku in Codeform zu bringen (im STD-Parser).
Patrick bittet um Klarheit bezüglich des Beispiels sub foo() { for @list { .say } }; foo(); 1
(2010) . Bitte konzentrieren Sie sich auf den Dialog zwischen Patrick und Larry (TimToady) über das, was Larry wollte, und ignorieren Sie Ablenkungen.
TimToady: "Senkenkontext ist sehr wichtig, um großartige Fehlermeldungen herauszufinden" (2012) . (Ich betrachte Rakus Sink-Funktion als ein extremes Problem bei der Implementierung von Qualen; siehe die unten stehenden Links zum Issue-Tracker.)
jnthn: "Beachten Sie, dass der eifrige Kontext und der Senkenkontext unterschiedlich sind. Der Senkenkontext sollte dazu führen, dass eine for-Schleife (oder Karte) keine Ergebnisliste erstellt." (2012) Dies ist das andere Element zum Senken des Kontexts. Es geht nicht nur um tolle Fehlermeldungen. Es geht auch um Leistung.
TimToady: "Wie auch immer, -> Nil scheint eine ziemlich gute Dokumentation eines Verfahrens zu sein, das nur wegen seiner Nebenwirkungen durchgeführt wird" (2012)
TimToady: "Wir könnten so weit gehen, separate Deklaratoren für" Prozeduren "zu haben, aber nur einen Sink-Return-Typ zu haben, scheint dies bereits zu sagen" (er meinte --> Nil
) (2012)
jnthn fragt: "TimToady: Jedes Gefühl auf https://rt.perl.org/Ticket/Display.html?id=126005? Grundsätzlich versenken Dinge wie Schleifen ihre letzte Anweisung, sodass der Schleifenblock Nil ergibt, also das UNDO Phaser feuert. " (2015) (Mehr Qualen der Implementierer ...)
9 offene Ausgaben in Rakudo / Rakudo, die einer Suche nach "letzte Aussage" entsprechen
Mehrere offene Probleme in Rakudo / Rakudo, die einer Suche nach "zoffix sink" entsprechen ; Beachten Sie insbesondere Mängel im impliziten Sink- / &unwanted
Helfer- Ticket Nr. 157 .