Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Wie sollte eine Template-Syntax für Delphi aussehen? (https://www.delphipraxis.net/60438-wie-sollte-eine-template-syntax-fuer-delphi-aussehen.html)

jbg 6. Jan 2006 21:45


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:
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;
Vielleicht nenne ich das ganze auch statt "template" einfach "generic", denn so mächtig wie die C++ Templates wird das sicherlich nicht.


Ich warte auf eure syntax und andere Vorschläge/Kritiken.

NicoDE 9. Jan 2006 10:22

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...

choose 9. Jan 2006 10:28

Re: Wie sollte eine Template-Syntax für Delphi aussehen?
 
Hallo jbg,

vielleicht kannst Du Dich bei der Wahl Deiner Syntax von Chrome inspirieren lassen. Die Sprache ist an Pascal angelehnt und unterstützt Generics auf ähnliche Weise wie von Dir skizziert.

jbg 9. Jan 2006 13:25

Re: Wie sollte eine Template-Syntax für Delphi aussehen?
 
Zitat:

Zitat von NicoDE
Das Finden von 'T' beim Parsen des Templates könnte ziemlich aufwändig werden.

Wieso? Ein Suchen Ersetzen funktioniert da sowieso nicht. Da muss ich schon meinen Lexer einsetzen und mit dem ist es gar kein Problem das T zu finden.

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:

vielleicht kannst Du Dich bei der Wahl Deiner Syntax von Chrome inspirieren lassen.
Also das mit dem "where type has constructor" werde ich bestimmt nicht einbauen. Dazu müsste das Plugin ja Delphicode "verstehen". Über das "instantiate" lasse ich gerne reden. Ich brauche halt nur Platz für zwei {$INCLUDE ...} (einmal im interface- und einmal im implementation-Block), da ich die Zeilen nicht verschieben will/darf wegen der Fehlermeldungen, die sonst wo ganz anders angezeigt werden.

Das "<T>" statt "<T: type>" wäre möglich, da es auch so eine entsprechende Syntax bereits gibt:
"procedure bla(const T; size: Integer);"

NicoDE 9. Jan 2006 13:28

Re: Wie sollte eine Template-Syntax für Delphi aussehen?
 
Zitat:

Zitat von jbg
Da muss ich schon meinen Lexer einsetzen und mit dem ist es gar kein Problem das T zu finden.

Wenn du ohnehin schon einen Lexer geschrieben hast, dann hat sich mein Vorschlag erledigt ;)

choose 9. Jan 2006 14:37

Re: Wie sollte eine Template-Syntax für Delphi aussehen?
 
Zitat:

Zitat von jbg
Das "<T>" statt "<T: type>" wäre möglich

Macht das denn überhaupt sinn? Weder die Codeverfolgständigung noch ErrorInsight könnten Dir beim Erstellen der "Generic-Implementierung" helfen. Deiner Aussage
Zitat:

Zitat von jbh
Dazu müsste das Plugin ja Delphicode "verstehen"

entnehme ich, dass Du bei der Bildung eines Delphi-konforment Alias wie TIntList ohnehin nicht vorhast auf die Typkompatiblität zu prüfen, oder?

Elvis 9. Jan 2006 15:34

Re: Wie sollte eine Template-Syntax für Delphi aussehen?
 
Zitat:

Zitat von choose
Macht das denn überhaupt sinn? Weder die Codeverfolgständigung noch ErrorInsight könnten Dir beim Erstellen der "Generic-Implementierung" helfen. Deiner Aussage
Zitat:

Zitat von jbh
Dazu müsste das Plugin ja Delphicode "verstehen"

entnehme ich, dass Du bei der Bildung eines Delphi-konforment Alias wie TIntList ohnehin nicht vorhast auf die Typkompatiblität zu prüfen, oder?

Wenn man aus Andreas' Bleistift ein ganz simples Template ableitet...
Delphi-Quellcode:
template
  TTemplate<T : type> = class
  private
    fValue : T;
  public
    property Value : T read fValue write fValue;
  end;
und die typisierte Verwendung in eine eigene Unit packt...
Delphi-Quellcode:
instantiate TTemplate<Integer> as TInteger;
..., die Verwendung schließlich wieder in einer eigenen Unit stattfindet (Ich habe sowie einen Hang dazu möglichst 1 Klasse/Datei zu haben ;-))...
Delphi-Quellcode:
var Instanz : TInteger;
begin
  Instanz := TInteger.Create();
  Instanz.Value := 1;
...
... könnte man die IDE austricksen, da sie lieber DCUs verwendet als PAS-Dateien.
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:
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;
Aber ich glaube kaum, dass das möglich ist. :cry:

jbg 9. Jan 2006 16:29

Re: Wie sollte eine Template-Syntax für Delphi aussehen?
 
Zitat:

Zitat von Elvis
Da Andreas IMHO einen Wrapper um den dcc gebaut

Da existiert noch nichts bis auf die Technik für den IDE Compiler. Beim dcc32 bräuchte ich DLL-Injection Code, der auch schon für den bcc32.exe existiert, also kein Problem darstellen würde.

Zitat:

Ich freue mich schon darauf vllt mit einer Vorab-Version spielen zu können... :)
Da musst du dich noch einige Zeit gedulden, denn vorher muss ich mir alle möglichen Konstellationen, wie forward-Deklarationen, Mehrfachinstanzierung mit dem selben Type (soll ja die selbe Klasse=VMT werden) geitig durchspielen.

Zitat:

Was mir noch fehlt wäre die Möglichkeit innerhalb eines generischen Types auf einen generischen Typ zuzugreifen:
Warum sollte das nicht möglich sein?

Delphi-Quellcode:
TTemplate<T : type> = class(TInterfacedObject, ITemplate<T>)
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).

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:

Wenn du ohnehin schon einen Lexer geschrieben hast
Der existiert schon länger und ist bereits als PHP Version verfügbar (wird vom DSDT Forum eingesetzt).


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:06 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz