![]() |
Wie sollte eine Template-Syntax für Delphi aussehen?
Da ich jetzt durch ein anderes Projekt in der Lage bin dem Delphi IDE Compiler andere Daten unterzujubeln kam mir mal wieder meine alte Idee (hatte die schon zu BorlandPascal 7 Zeiten), Templates zu implementieren. Jetzt stellt sich natürlich die Frage, wie diese syntaktisch eingebaut werden sollen.
Mal ein Beispiel, das mir noch nicht so ganz 100%-tig gefällt:
Delphi-Quellcode:
Vielleicht nenne ich das ganze auch statt "template" einfach "generic", denn so mächtig wie die C++ Templates wird das sicherlich nicht.
interface
(* Template deklarieren, dies wird hinter den Kolissen durch ein "{$INCLUDE ...}" ersetzt, in der alle Template-Instanzierungen deklariert werden. *) template TMyTpl<T: type; StartCount: Integer = 10> = class(TObject) private FField: array of T; public constructor Create; end; implementation (*<<< wird durch {$INCLUDE ...} ersetzt, in der alle Template-Instanzierungen implementiert werden. *) constructor TMyTpl.Create; begin SetLength(FField, StartCount); end; {>>>} { Template instanzieren und als TIntList deklarieren } instantiate TMyTpl<Integer, 10> as TIntList; { wird hinter den Kolissen zu "type TIntList = WasWeissIchMangledName;" } procedure TForm1.FormCreate(...); var MyList: TIntList; begin MyList := TIntList.Create; ... MyList.Free; end; Ich warte auf eure syntax und andere Vorschläge/Kritiken. |
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Das Finden von 'T' beim Parsen des Templates könnte ziemlich aufwändig werden. Man könnte mittels Syntax etwas wie 'typename T' erzwingen um Doppeldeutigkeiten zu verhindern...
|
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Hallo jbg,
vielleicht kannst Du Dich bei der Wahl Deiner Syntax von ![]() |
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Zitat:
Das Problem mit "typename T" ist, dass es nicht so richtig in die Pascal Syntax hineinpasst. Ich hatte auch schon "List<type T>" stehen, bis mir einfiel, dass man in Delphi den Typ immer mit Doppelpunkt getrennt hinten anfügt. Zitat:
Das "<T>" statt "<T: type>" wäre möglich, da es auch so eine entsprechende Syntax bereits gibt: "procedure bla(const T; size: Integer);" |
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Zitat:
|
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Zitat:
Zitat:
|
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Zitat:
Delphi-Quellcode:
und die typisierte Verwendung in eine eigene Unit packt...
template
TTemplate<T : type> = class private fValue : T; public property Value : T read fValue write fValue; end;
Delphi-Quellcode:
..., die Verwendung schließlich wieder in einer eigenen Unit stattfindet (Ich habe sowie einen Hang dazu möglichst 1 Klasse/Datei zu haben ;-))...
instantiate TTemplate<Integer> as TInteger;
Delphi-Quellcode:
... könnte man die IDE austricksen, da sie lieber DCUs verwendet als PAS-Dateien.
var Instanz : TInteger;
begin Instanz := TInteger.Create(); Instanz.Value := 1; ... Da Andreas IMHO einen Wrapper um den dcc gebaut hat dürfte der Zeitstempel der TTemplate- und TInteger-PAS somit älter als der der TInteger-DCU sein. Die eigentliche Prüfung übernimmt schon der Compiler, Intellisense sollte aus der DCU funktionieren. Ich habe mich hier mal wieder ziemlich weit aus dem Fenster gelehnt, aber ich denke das war doch der Sinn dahinter. Und falls es so funktionieren sollte wäre doch eine super Vereinfachung. :thuimb: Ich freue mich schon darauf vllt mit einer Vorab-Version spielen zu können... :) Was mir noch fehlt wäre die Möglichkeit innerhalb eines generischen Types auf einen generischen Typ zuzugreifen:
Delphi-Quellcode:
Aber ich glaube kaum, dass das möglich ist. :cry:
template
ITemplate<T : type> = interface function getValue : T; procedure setValue(value : T); property Value : T read getValue write setValue; end; template TTemplate<T : type> = class(TInterfacedObject, ITemplate<T>) private fValue : T; function getValue : T; procedure setValue(value : T); public property Value : T read getValue write setValue; end; |
Re: Wie sollte eine Template-Syntax für Delphi aussehen?
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Hier würde der Parser alle Ts durch den angegebenen Typ ersetzen. So auch "ITemplate<T>". Kommt er nun zu ITemplate<Integer> wird dieses wieder als Template instanziert, ... (eine Rekursive Funktion sollte das behandeln können).
TTemplate<T : type> = class(TInterfacedObject, ITemplate<T>)
Ich muss nur irgendwo meine {$INCLUDE 'virtualfilename.inc'} unterbringen, so dass ich nicht die Zeilen- und Spaltennummerierung durcheinander bringe. Es wäre nicht so schön, wenn man einen Syntaxfehler in Zeile 100 bekommt, obwohl nut 98 Zeilen vorhanden sind. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz