Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Generics Syntax #18

Open
bafto opened this issue Jun 27, 2023 · 5 comments
Open

Generics Syntax #18

bafto opened this issue Jun 27, 2023 · 5 comments
Labels
Typ: Konzept Nur ein Konzept für eine Idee Typ: Neues Feature Neues Feature
Milestone

Comments

@bafto
Copy link
Member

bafto commented Jun 27, 2023

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 bafto added the Typ: Neues Feature Neues Feature label Jun 27, 2023
@NotLe0n NotLe0n added the Typ: Konzept Nur ein Konzept für eine Idee label Jun 30, 2023
@Magi3r Magi3r mentioned this issue Dec 5, 2023
@bafto
Copy link
Member Author

bafto commented Dec 19, 2023

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
Copy link
Member Author

bafto commented Dec 19, 2023

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

@NotLe0n NotLe0n added this to the beta release milestone Jan 8, 2024
@bafto
Copy link
Member Author

bafto commented Jul 13, 2024

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
Copy link
Member

NotLe0n commented Jul 13, 2024

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.

@bafto
Copy link
Member Author

bafto commented Nov 13, 2024

Einen generischen Typ würde man dann so benutzen:

Die Text-Zahl-Karte m ist ... [ Map<String, Integer> m =  ]

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Typ: Konzept Nur ein Konzept für eine Idee Typ: Neues Feature Neues Feature
Projects
None yet
Development

No branches or pull requests

2 participants