Warum ist die Schleifenvariablendeklaration von Perl 6 im äußeren Bereich?

8

In Perl 6 befindet sich eine Variable im for-style loop im äußeren Bereich. Das funktioniert und ist dokumentiert .

%Vor%

Das $n ist außerhalb des Blocks sichtbar:

%Vor%

Gibt es hier einen motivierenden Trick, der sich von dem unterscheidet, was man von den Vorfahren von Perl 6 erwarten würde? Ich habe in den Designdokumenten keine Erwähnung davon gesehen (aber probier mal "loop"). Ich konnte mir kein Beispiel vorstellen, wo dies die Dinge erleichtern würde.

In Perl 5 ist dasselbe ein strikter Fehler:

%Vor%

Und in C (denen, die Sie das tun lassen) ist es ein ähnlicher Fehler:

%Vor%

Wie bei meinen Fragen üblich, bin ich nicht an einer Problemumgehung interessiert. Ich weiß, wie man das macht.

Wie ich bereits in den Kommentaren erwähnt habe, verschiebt Synopsis 4 die Implementierung, um Lexika zu deklarieren nur innerhalb des Blocks, wo sie erscheinen werden.

Das $n erscheint vor dem { , also ist es nicht "innerhalb" des Blocks.

Aber was ist mit spitzen Blöcken?

%Vor%

Und, Unterprogramm-Signaturen?

%Vor%

Diese Variablen werden zuerst vor { eingegeben.

Es interessiert mich nicht besonders, aber wenn ich diesen Bruch mit der Tradition erklären muss, indem ich sage, dass Sie lexikalische Variablen in den Blöcken deklarieren müssen, in denen Sie sie verwenden werden, kann jemand auf diese Fälle hinweisen.

    
brian d foy 31.07.2017, 04:59
quelle

2 Antworten

6

Sie können sich das vorstellen, da ein Block einen lexikalischen Geltungsbereich erzeugt.

%Vor% %Vor% %Vor%

Es ist nur so, dass andere C-ähnliche Sprachen die (C-Stil) for -Schleife und das Perl 6-Design so wenige Spezialfälle wie möglich haben.

Wenn also etwas an einem Ort sehr nützlich ist, sollte es so entworfen werden, dass es überall verwendbar ist.

Zum Beispiel -1 Indizierung in Arrays.
Anstatt @a[*-1] als spezielle Syntax für die Array-Indizierung zu verwenden, ist *-1 nur eine Möglichkeit, ein Lambda / Closure zu erstellen, das Sie überall dort verwenden können, wo Sie ein einfaches Lambda wollen.

Ein weiteres Beispiel sind spitze Blöcke, die mehr als nur eine Möglichkeit sind, die Iterationsvariable (n) in einer for -Schleife zu deklarieren.

%Vor%

Sie sind mit jedem ähnlichen Konstrukt verwendbar.

%Vor%

Anstelle von

%Vor%

Sie können es sogar als eine andere Syntax verwenden, um ein Lambda zu erstellen.

%Vor%

Um die Sprache einfacher zu verstehen, müssen Spezialfälle ihr eigenes Gewicht ziehen, und nur die Argumente des Konstrukts loop und kein anderes Konstrukt, das Teil des Blocks ist, tun dies nicht.
Wenn es allgemein nützlich wäre, wäre es anders.

Auch das loop -Konstrukt ist eines der wenigen Features, das nicht wirklich zur allgemeinen Designästhetik von Perl 6 passt. Ich denke, es könnte leichter sein, für seine Entwertung und Entfernung zu argumentieren, als dass es spezieller wäre verrohrt.
(Niemand streitet dafür, dass er entfernt wird)

    
Brad Gilbert 31.07.2017, 15:38
quelle
4

Ich sehe den Anwendungsfall in etwa so:

%Vor%

Das wäre schwer mit:

%Vor%

was ist das for äquivalent.

Abgesehen davon habe ich keine Ahnung.

    
Elizabeth Mattijsen 31.07.2017 14:55
quelle

Tags und Links