2016-08-04 18 views
3

In per5 kann ich einfach eine Variable wie $ foo oder @bar verwenden, ohne "mein" zu verwenden.Warum kann nicht perl6 einfach autovivify, so dass ich nicht "mein" die ganze Zeit verwenden muss?

$foo=1; @bar=(1,2); 

In Perl6, warum muss ich "mein" die ganze Zeit verwenden? Andernfalls sagt der Compiler die Variable undeclared.Warum kann nicht perl6 nur autovivify?

print "{my @a=1,2,3;}\n"; # have to use "my" to declare variable 
print "{@a=1,2,3;}\n"; # this is error 'Variable '@a' is not declared' 

Ich mag nicht die Einschränkung, immer "mein" verwenden zu müssen. Dies ist zu niedrig wie C; sehr umständlich.

Gibt es eine Möglichkeit, immer autovivify einzuschalten?

Danke.

+2

Der einzige Grund dafür ist, dass es in früheren Versionen so funktioniert. Wenn Sie Ihren Perl 5-Code nicht mit 'use strict' und' use warnings' (oder anderen Deklarationen, die das in Ihrem Namen tun) starten, schreiben Sie schrecklichen Perl 5-Code. Ich empfehle das Buch "Modern Perl" zu lesen (kostenlos vom Autor/Herausgeber zur Verfügung gestellt). –

+2

Dies ist überhaupt nicht so niedrig wie C. Es ist eher ein sehr hohes Niveau. In sehr-sehr niedrigen Programmierung wie Assembly können Sie jede beliebige RAM-Adresse verwenden, ohne zu deklarieren, was Sie zuerst verwenden möchten. Wenn Sie zufällig vergessen, kann dies dazu führen, dass Sie versehentlich die gleiche RAM-Adresse für zwei Variablen verwenden - einen Fehler verursachen. Mit "mein" kannst du der Sprache einen Hinweis geben: hey, hier deklariere ich meine Variable. Wenn Sie es vor der Deklaration verwenden, kann sich der Compiler beschweren, wenn Sie es zweimal deklarieren, kann sich der Compiler beschweren. Dann weißt du, dass du einen Fehler gemacht hast. – slebetman

+1

* "Der einzige Grund, warum es standardmäßig so ist, ist, dass es in früheren Versionen so funktioniert hat" * Aber so * war es vorher nicht. Standardmäßig ist jede Perl 5-Variable eine Paketvariable. Es ist jetzt der Standard, weil der Perl 5 Weg falsch war. – Borodin

Antwort

10

Keine expliziten Variablendeklarationen zu haben ist aus verschiedenen Gründen eine schreckliche Idee aus der Perspektive des Sprachdesigns. Offensichtlich sind explizit deklarierte lexikalische Variablen auf Blockebene der Weg, und ich finde es verrückt, wie viele Sprachen der 'Scripting'-Variante das' falsch 'machen (es gibt einen Grund, warum let zu Javascript hinzugefügt wurde ...)

Das besagt, Perl6 unterstützt das no strict Pragma, mit dem Sie die Deklaration weglassen können.

4
no strict; 
$foo=1; @bar=(1,2); 
print "{@a=1,2,3;}\n"; 
# OUTPUT«1 2 3␤» 

Perl 6 versucht, Ihnen mit den richtigen Fehlermeldungen zu helfen. Wenn Sie alle Variablen deklarieren, erhalten Sie eine Schätzung, welche Variable Sie bei einem Tippfehler meinen. Außerdem gibt es neue Sprachfunktionen wie Konstanten und sigellose Variablen, die ohne Deklaratoren nicht geschrieben werden können.

+1

Großartig! Danke, dass du deine Gedanken geteilt hast. Ich denke, ich mag die Freiheit von "nicht streng". – lisprogtor

+3

@lisprogtor: Leider enthält diese "Freiheit" die Freiheit, Fehler zu schreiben, die die Sprache nicht meldet. Für ein ganz neues Beispiel, werfen Sie einen Blick auf [* Schreiben Sie ein Perl-Skript, das ein FASTA übernimmt und alle Sequenzen umkehrt *] (http://stackoverflow.com/questions/38775912/), wo das OP keine finden konnte Fehler, der durch die Verwendung von '$ NUM_COL' und' $ NUM_C0L' verursacht wurde. Das Schlüsselwort 'my' ist eines der kürzesten, weil es so häufig verwendet wird, und jedes Programm, das' no strict' verwendet, das mehr als ein paar Zeilen lang ist, ist ein schlecht geschriebenes Programm. – Borodin