Schade, dass du nicht auf meine Perl-Kritik eingegangen bist, sondern direkt zu anderen Beispielen gesprungen bist, aber ich bin gerne bereit, auch darauf einzugehen.
In Perl hat der
*
übrigens auch eine weitere Bedeutung die jedoch jeder Perlentwicker sofort sieht am Ausdruck:
Sigils spielen in Perl eine ähnliche Rolle wie Typsignaturen in Haskell. Aber mit ein paar Nachteilen: Es gibt nur eine handvoll Sigils, um zwischen Werten verschiedener Typen zu diskreminieren. Skalare $
, Arrays @
, Hashes %
, Subroutinen &
und eben den Typeglob *
, unter den alle Werte fallen. Allen mangelt es an Expressivität: Mit einem $
-Sigil kann ich nicht ausdrücken, dass mein Skalar eine Ganzzahl oder ein String ist. Mit einem @
-Sigil kann ich nicht angeben, welchen Typen die Elemente in meinem Array haben. Mit dem &
-Sigil kann ich nicht angeben, welche Parametertypen und welchen Rückgabetypen eine Subroutine hat. Mit einem %
-Sigil kann ich nicht ausdrücken, welche Schlüssel-Werte-Kombinationen vorhanden sein müssen. Mit dem Typeglob *
weiß ich letztendlich überhaupt nichts mehr über den Typen. In Haskell kann ich all die eben erwähnten Sachverhalte über Typsignaturen ausdrücken. Es mangelt Perl hier also im Vergleich wieder an Ausdruckssärke. Der andere große Nachteil ist, dass Perl dynamisch typisiert ist, die Typinformationen, die in den Sigils stecken, werden also erst zur Laufzeit gecheckt. In Haskell würde ein fehlerhaft typisiertes Programm nicht kompilieren und den Programmierer direkt auf den Fehler aufmerksam machen. Und wie schon erwähnt, findet der Haskell-Compiler die meisten Typen von alleine heraus, der Programmierer muss keine Typsignaturen dafür schreiben.
was aber auch ohne das Schlüsselwort
state
per se so ist. In Perl kann man perlocal
sogar mit dynamischen Scope arbeiten, hier mal alles zsamme:
Ich halte dynamische Scoping-Regeln in jedem Fall für einen schweren Design-Fehler, ob in JavaScript, Java oder Perl. Dynamisches Scoping drückt aus: „Du findest hier nicht alle Informationen, die du brauchst, um diesen Code zu verstehen, weil ein paar Informationen erst zur Laufzeit eintreffen.“