Es ist ein bisschen subjektiv, aber ich hoffe, dass ich besser verstehe, welche Faktoren einen Bediener dazu bringen, die Verwendung klarer als stumpf und schwierig zu machen. Ich habe in letzter Zeit über Sprachentwürfe nachgedacht, und ein Problem, bei dem ich immer wieder zurückkehre, ist, wann man eine Schlüsseloperation in der Sprache zum Operator macht und wann man ein Schlüsselwort oder eine Funktion verwendet.
Haskell ist dafür etwas berüchtigt, da benutzerdefinierte Operatoren einfach zu erstellen sind und häufig ein neuer Datentyp mit mehreren Operatoren zur Verwendung darauf gepackt wird. Die Parsec-Bibliothek enthält zum Beispiel eine Menge Operatoren zum Kombinieren von Parsern mit Edelsteinen wie >.
und .>
ich kann mich nicht einmal daran erinnern, was sie jetzt bedeuten, aber ich erinnere mich, dass es sehr einfach ist, mit ihnen zu arbeiten, wenn ich mir was auswendig gelernt habe sie meinen eigentlich. Wäre ein Funktionsaufruf wie leftCompose(parser1, parser2)
besser gewesen? Sicher ausführlicher, aber in gewisser Weise klarer.
Überladungen von Operatoren in C-ähnlichen Sprachen sind ein ähnliches Problem, das jedoch durch das zusätzliche Problem der Überladung der Bedeutung vertrauter Operatoren +
mit ungewöhnlichen neuen Bedeutungen verursacht wird.
In jeder neuen Sprache scheint dies ein ziemlich schwieriges Thema zu sein. In F # verwendet das Casting beispielsweise einen mathematisch abgeleiteten Typ-Casting-Operator anstelle der Cast-Syntax im C # -Stil oder des ausführlichen VB-Stils. C #: (int32) x
VB: CType(x, int32)
F #:x :> int32
Theoretisch könnte eine neue Sprache Operatoren für die meisten integrierten Funktionen enthalten. Anstelle von def
oder dec
oder var
für die Variablendeklaration, warum nicht ! name
oder @ name
ähnliches. Dies verkürzt mit Sicherheit die Deklaration, gefolgt von der Bindung: @x := 5
Statt declare x = 5
oder Für die let x = 5
meisten Codes sind viele Variablendefinitionen erforderlich. Warum also nicht?
Wann ist ein Operator klar und nützlich und wann ist er undeutlich?
+
für die Verkettung von Zeichenfolgen oder <<
für Streams). In Haskell hingegen ist ein Operator entweder nur eine Funktion mit einem benutzerdefinierten Namen (dh ohne Überladung) oder Teil einer Typklasse. Dies bedeutet, dass der Operator zwar polymorph ist, aber für jeden Typ dieselbe logische Aktion ausführt hat sogar die gleiche Typunterschrift. Also >>
ist >>
für jeden Typ etwas dabei und wird auch nie ein bisschen verschoben.