DDP-Projekt / Kompilierer

Der Kompilierer der Deutschen Programmiersprache
https://ddp.le0n.dev/Spielplatz
MIT License
138 stars 4 forks source link

Generics Syntax #18

Open bafto opened 1 year ago

bafto commented 1 year ago

Generics sind zwar ein Feature für die ferne Zukunft, aber hier trotzdem schonmal ein Syntax Vorschlag:

Die Funktion foo mit den Typparametern T und R und  dem Parameter t vom Typ T, gibt ein R zurück, macht:
... [normale Funktionsdeklaration]
bafto commented 8 months ago

Erneuerter Vorschlag mit Kombinationen (mit ein paar ungelösten Problemen):

Für Kombinationen braucht es ebenfalls Syntax um generische Typen anzugeben. Dazu schlage ich zusätzlich noch als weiteres Feature Typedefs vor (seperater Issue aber hier schon aufgeführt).

Wir nennen die von den Typparametern Schlüssel und Wert abhängige Kombination aus:
    [
     Was soll der Standartwert von Schlüssel oder Wert sein? 
        Vorschlag: 0 für Zahl, "" für Text, nur Standartwerte für Strukturen, etc.
     Problem: Es gibt (viele) Kombinationen, die keinen solchen Konstruktor-Alias haben (also einen Alias ohne Parameter).
     Solche Kombinationen wollen eigentlich nicht mit ihren Standardwerten, sondern mit Parametern instanziert werden.
    ]
    dem Schlüssel schlüssel, 
    dem Wert wert, [""]
einen KartenEintrag, und erstellen sie so:
    "ein KartenEintrag aus <schlüssel> und <wert>"

[ Typedefs würden auch für normale Typen gehen, aber auch spezielle Syntax für Generische Typen erlauben ]
Ein TextZahlEintrag ist ein KartenEintrag mit S gleich Text und W gleich Zahl. 

Wir nennen die von den Typparametern T und U abhängige Kombination aus:
    [
      Problem hier und bei Funktionsparametern.
      Wie instanziert man generische Typen ohne Typedef?
      So wie hier ist es sehr hässlich und lang, und in Funktionsdeklarationen ist es ein noch größeres Problem.
    ]
    der KartenEintrag mit Schlüssel gleich T und Wert gleich U Liste einträge mit Standardwert eine leere KartenEintrag mit Schlüssel gleich T und Wert gleich U Liste. [ doppelte Typ-instanzierung! ]
eine Karte, und erstellen sie so:
    "eine leere Karte"

[ Hilfs-typedefs ]
Eine TextZahlKarte ist eine Karte mit T gleich Text und U gleich Zahl.
Eine TextTextKarte ist eine Karte mit T gleich Text und U gleich Text.

Die von den Typparametern T und U abhängige Funktion foo mit den Parametern
k1 und k2 vom Typ
TextTextKarte [elegant mit einem Typedef gelöst]
und Karte mit T gleich T und U gleich U [sehr hässlich, weil Typparameter weitergeben werden müssen],
gibt nichts zurück, macht:
    ...
Und kann so benutzt werden:
    ...

Wie man sieht gibt es ein kleines und ein großes Problem bei diesem Ansatz.

Das kleine Problem ist die Frage welchen Standartwert Generische Kombinations-Variablen haben sollen.

Das deutlich größere Problem ist die Frage wie man einen generischen Typ instanziert. Der Ansatz Typname mit T gleich Text, U gleich Zahl und V gleich Kommazahl ist unglaublich lang und oftmals redundant. Bis jetzt ist mir allerdings noch kein besserer eingefallen.

bafto commented 8 months ago

Die Typedef Syntax oben war nur ein temporärer Vorschlag. Für eine bessere Variante siehe den Issue zu Typedefs.

bafto commented 1 month ago

Neue Idee um die Syntax kompakter zu machen @NotLe0n : Anstatt dass man die Typparameter explizit angibt (... von den Typparametern ... abhängige ...), werden diese aus dem Kontext abgeleitet:

[TypDef nur als Beispiel, damit es noch einen anderen Typnamen als die eingebauten gibt]
Wir definieren eine Hausnummer als eine Zahl.

Die generische Funktion foo mit den Parametern a, b und c vom Typ Zahl, Hausnummer und T, gibt nichts zurück, macht:
    ...
Und kann so benutzt werden:
    "foo <a> <b> <c>"

In diesem Beispiel ist foo als generisch markiert. Dieses Keyword würde dafür sorgen, dass jeder Parametertype, der noch nicht bekannt ist (in diesem Fall nur T) automatisch als Typparameter interpretiert wird. Wenn foo nicht als generisch markiert wäre, dann würde es einen Fehler geben, dass es keinen Typ T gibt.

NotLe0n commented 1 month ago

Das ist eine gute Idee. Das Schlüsselwort "generisch" gibt die Information, dass T ein generischer Parametertyp ist, sodass die Frage: "Was ist T?" beantwortet ist.