Eine Funktion, die ich in funktionalen Sprachen vermisse, ist die Idee, dass Operatoren nur Funktionen sind. Das Hinzufügen eines benutzerdefinierten Operators ist daher oft so einfach wie das Hinzufügen einer Funktion. Viele prozedurale Sprachen erlauben Überladungen von Operatoren, so dass Operatoren in gewissem Sinne immer noch Funktionen sind (dies gilt sehr für D, wo der Operator als Zeichenfolge in einem Vorlagenparameter übergeben wird).
Wo das Überladen von Operatoren zulässig ist, scheint es oft trivial zu sein, zusätzliche benutzerdefinierte Operatoren hinzuzufügen. Ich habe diesen Blog-Beitrag gefunden , der argumentiert, dass benutzerdefinierte Operatoren aufgrund von Vorrangregeln nicht gut mit der Infix-Notation funktionieren, aber der Autor gibt verschiedene Lösungen für dieses Problem an.
Ich habe mich umgesehen und konnte keine prozeduralen Sprachen finden, die benutzerdefinierte Operatoren in der Sprache unterstützen. Es gibt Hacks (wie Makros in C ++), aber das ist kaum dasselbe wie Sprachunterstützung.
Warum ist diese Funktion nicht häufiger anzutreffen, da sie ziemlich einfach zu implementieren ist?
Ich verstehe, dass dies zu hässlichem Code führen kann, aber das hat Sprachdesigner in der Vergangenheit nicht davon abgehalten, nützliche Funktionen hinzuzufügen, die leicht missbraucht werden können (Makros, ternäre Operatoren, unsichere Zeiger).
Tatsächliche Anwendungsfälle:
- Fehlende Operatoren implementieren (zB Lua hat keine bitweisen Operatoren)
- Mimic D's
~
(Array-Verkettung) - DSLs
- Verwendung
|
als Syntaxzucker im Unix-Pipe-Stil (mit Coroutinen / Generatoren)
Ich bin auch in Sprachen interessiert , die tun benutzerdefinierte Operatoren erlauben, aber ich bin mehr daran interessiert, warum es ausgeschlossen wurde. Ich dachte darüber nach, eine Skriptsprache zu forken, um benutzerdefinierte Operatoren hinzuzufügen, stoppte mich jedoch, als ich merkte, dass ich sie nirgendwo gesehen habe. Es gibt also wahrscheinlich einen guten Grund, warum Sprachdesigner, die schlauer sind als ich, es nicht zugelassen haben.