Advanced Records und überladene Operatoren

Zur Vorstellung von Komponenten und Units für Lazarus
Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Advanced Records und überladene Operatoren

Beitrag von theo »

Ich wollte schon länger mal die neueren FPC Features Advanced Records und überladenen Operatoren testen.
Da gestern der UTF8Scanner ein Thema war, wollte ich anhand dieses Beispiels mal testen, was so geht.

Herausgekommen ist das: https://www.theo.ch/lazarus/unistring.pas" onclick="window.open(this.href);return false;

Es ist so also möglich, aus der UTF8Scanner Klasse einen Record zu machen und diesem mit Operatoren zu versehen.
Das hat den Vorteil, dass es kein "Create" und "Free" braucht und direkte Zuweisungen aller Art möglich sind.
Somit verhält sich der daraus entstandene "TUniString" Record für den Benutzer ähnlich wie ein "eingebauter" String Typ.
Lustig oder?

Das Beispiel zeigt wie's geht:

Code: Alles auswählen

var s,s1:TUniString;
  i:integer;
  u:String;
begin
   //Verschiede Arten Strings sind direkt zuweisbar:
   s:='öäü lorem ipsum öäü';
   s1:=' Anhang';
   //Verketten:
   s:=s+s1+' und noch länger';
 
   //Einzelne "Buchstaben" zugreifen (trotz UTF-8)
   s[1]:='A';
   s[s.Length]:='E';
 
   //Mit Case "Buchstaben" ersetzen
   for i:=1 to s.length do
    case s[i] of
      'o','ö': s[i]:='@';
    end;
 
   //"String Iterator", schnellster Zugriff
   s.Reset;
   Repeat
     Memo1.lines.add(s.Next);
   until s.Done;
 
   //Oder mit for...in;
   for u in s do writeln(u);   
 
   //Als Gag eingebaut
   s.SaveToFile('ustest.txt');
 
   //und einiges mehr..
end;
Zuletzt geändert von theo am Di 24. Apr 2012, 00:21, insgesamt 1-mal geändert.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Advanced Records und überladene Operatoren

Beitrag von mse »

Was sind die Unterschiede von "advanced records" zu "object"?
http://www.freepascal.org/docs-html/ref/refch5.html#x57-640005
http://www.freepascal.org/docs-html/ref/refch9.html#x96-1060009
"advanced records" scheinen eine "Untermenge" von "object" zu sein?

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Advanced Records und überladene Operatoren

Beitrag von theo »

Naja ich bin da kein Theoretiker, Objects habe ich nie studiert, die waren irgendwann mal "deprectated".
Der advanced Record ist aber erstmal immer noch ein Record, mit z.B. Variant Teilen.

Code: Alles auswählen

case Integer of
       0: (Left, Top, Right, Bottom: Integer);
       1: (TopLeft, BottomRight: TPoint);


Ausserdem weiss ich nicht, ob man auf Objects überladene Operatoren anwenden kann.

EDIT: Ja, das geht offenbar. Wusste ich nicht.
Im Prinzip würde das Bsp. wohl auch mit Object funktionieren.
Ich hatte nur im Hinterkopf, dass Object aus irgendwelchen Gründen "Pfui" sei und schon ewig in Delphi als Auslaufmodell behandelt wurde.

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Advanced Records und überladene Operatoren

Beitrag von marcov »

mse hat geschrieben:Was sind die Unterschiede von "advanced records" zu "object"?
http://www.freepascal.org/docs-html/ref/refch5.html#x57-640005
http://www.freepascal.org/docs-html/ref/refch9.html#x96-1060009
"advanced records" scheinen eine "Untermenge" von "object" zu sein?


Ich bin auch kein Sprache Theoretiker, aber:

Theo hat recht, Object ist immer deprecated gewesen (in Delphi (2+?)).

Object ist auch ein bisschen gefährlich weil es nicht immer ein record ist (zb wenn virtual methods definiert werden, und ein VMT hinzugefügt wird). Immer mehr Funktionalität wird auf advanced Records projektiert (mit generics, for..in usw), für was den VMT Link ein Komplikation würden.

Aber wesentlich sind advanced Record samt nutzen bis D2009-D2010 meistens .NET ich-auchs (me-toos). Und Struct ist VMT los in .NET

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Advanced Records und überladene Operatoren

Beitrag von theo »

Und weil ich gerade am testen von Neuem bin, habe ich dem TUniString noch einen Enumerator spendiert (Gleicher Link oben).

Damit gibt's nun auch die for...in Syntax

Code: Alles auswählen

var s:TUniString;
  sa:String;
begin
  s:='püöasfasdfä';
  for sa in s do writeln(sa)
end;

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: Advanced Records und überladene Operatoren

Beitrag von Christian »

Schick, gratulation:-)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Advanced Records und überladene Operatoren

Beitrag von mse »

marcov hat geschrieben:Theo hat recht, Object ist immer deprecated gewesen (in Delphi (2+?)).

Vermutlich auch aus Marketinggründen um die neuen TObject-Klassen zu propagieren und um Entwicklungsresourcen zu sparen, da dann keine Verpflichtung mehr besteht, sie weiterzupflegen.
In FPC werden objects aber weiterhin voll unterstützt? Wenn ich so meinen code anschaue, gibt es viele Orte wo die Verwendung von objects angebrachter wäre und wahrscheinlich die bessere Performance hätte als TObject Nachkommen.

Martin

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: Advanced Records und überladene Operatoren

Beitrag von Patito »

mse hat geschrieben:Was sind die Unterschiede von "advanced records" zu "object"?
http://www.freepascal.org/docs-html/ref/refch5.html#x57-640005
http://www.freepascal.org/docs-html/ref/refch9.html#x96-1060009
"advanced records" scheinen eine "Untermenge" von "object" zu sein?


Ein Unterschied ist wohl, dass bei den records die Vererbung fehlt.

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Advanced Records und überladene Operatoren

Beitrag von Heinrich Wolf »

mse hat geschrieben:
marcov hat geschrieben:Theo hat recht, Object ist immer deprecated gewesen (in Delphi (2+?)).

Vermutlich auch aus Marketinggründen um die neuen TObject-Klassen zu propagieren und um Entwicklungsresourcen zu sparen, da dann keine Verpflichtung mehr besteht, sie weiterzupflegen.
In FPC werden objects aber weiterhin voll unterstützt? Wenn ich so meinen code anschaue, gibt es viele Orte wo die Verwendung von objects angebrachter wäre und wahrscheinlich die bessere Performance hätte als TObject Nachkommen.

Martin

Hi,

was sind objects? Was ist der Unterschied zu TObject? Ab welcher Delphi Version gibt es objects?

Heiner

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Advanced Records und überladene Operatoren

Beitrag von marcov »

mse hat geschrieben:
marcov hat geschrieben:Theo hat recht, Object ist immer deprecated gewesen (in Delphi (2+?)).

Vermutlich auch aus Marketinggründen um die neuen TObject-Klassen zu propagieren und um Entwicklungsresourcen zu sparen, da dann keine Verpflichtung mehr besteht, sie weiterzupflegen.


Und keine Grund. Erst mit duck-typing Konstruktionen in Delphi 2006 erst gab es eine bedarf.

In FPC werden objects aber weiterhin voll unterstützt?


Mjaa, was ist "voll"? Meistens ist sie und wird sie da bleiben fuer Turbo Vision und der Textmode IDE. FPC ist wirklich TP kompatible, weil Delphi nur Sprache kompatibel ist.

Wenn ich so meinen code anschaue, gibt es viele Orte wo die Verwendung von objects angebrachter wäre und wahrscheinlich die bessere Performance hätte als TObject Nachkommen.


Wurde ich nicht tun. Entweder Objekte (und dann Classes) or löse es Prozedural. Aber das ist nur meine Meinung. Lazarus nutzt auch Objekte (LazIntfImage glaube ich).

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Advanced Records und überladene Operatoren

Beitrag von mse »

Heinrich Wolf hat geschrieben:was sind objects? Was ist der Unterschied zu TObject? Ab welcher Delphi Version gibt es objects?

http://www.freepascal.org/docs-html/ref/refch5.html#x57-640005
objects können auch auf dem stack und als globale Variablen angelegt werden und sind nicht zwingend dynamische heap Speicherobjekte. Eingeführt wurden sie irgendwann nach Turbo Pascal 4, in TP 6 gibt es sie schon, bei TP 5 bin ich nicht mehr sicher. Turbo Pascal ist der Vorgänger von Delphi.

Martin

Benutzeravatar
theo
Beiträge: 10467
Registriert: Mo 11. Sep 2006, 19:01

Re: Advanced Records und überladene Operatoren

Beitrag von theo »

Heinrich Wolf hat geschrieben:was sind objects? Was ist der Unterschied zu TObject? Ab welcher Delphi Version gibt es objects?


Das ist ein uralter Hut. Eigentlich gehören die zu Turbo Pascal oder noch früher:

http://en.wikipedia.org/wiki/Object_Pascal

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

Re: Advanced Records und überladene Operatoren

Beitrag von mse »

marcov hat geschrieben:Und keine Grund. Erst mit duck-typing Konstruktionen in Delphi 2006 erst gab es eine bedarf.

Findest du nicht, der Heapmanager, Initialisierung, afterconstruction(), beforedestruction() usw. sind happiger overhead?

marcov
Beiträge: 1100
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: Advanced Records und überladene Operatoren

Beitrag von marcov »

mse hat geschrieben:
marcov hat geschrieben:Und keine Grund. Erst mit duck-typing Konstruktionen in Delphi 2006 erst gab es eine bedarf.

Findest du nicht, der Heapmanager, Initialisierung, afterconstruction(), beforedestruction() usw. sind happiger overhead?


Ja. Aber wenn das ein Problem ist es fast nie nötig polymorphe Objekte zu nutzen. Und die Vererbungsmöglichkeit ist das einzige was TObject über Advanced Records hat. (und das ist der Vorteil als auch der Nachteil)

Heinrich Wolf
Beiträge: 323
Registriert: Di 12. Apr 2011, 13:21
OS, Lazarus, FPC: WinXP + VMWare Player mit Fedora14, L 1.1, FPC 2.7.1
CPU-Target: 1core 1,8GHz 32Bit
Wohnort: Fürth
Kontaktdaten:

Re: Advanced Records und überladene Operatoren

Beitrag von Heinrich Wolf »

Heinrich Wolf hat geschrieben:was sind objects? Was ist der Unterschied zu TObject? Ab welcher Delphi Version gibt es objects?

mse hat geschrieben:http://www.freepascal.org/docs-html/ref/refch5.html#x57-640005
objects können auch auf dem stack und als globale Variablen angelegt werden und sind nicht zwingend dynamische heap Speicherobjekte. Eingeführt wurden sie irgendwann nach Turbo Pascal 4, in TP 6 gibt es sie schon, bei TP 5 bin ich nicht mehr sicher. Turbo Pascal ist der Vorgänger von Delphi.

theo hat geschrieben:Das ist ein uralter Hut. Eigentlich gehören die zu Turbo Pascal oder noch früher:

http://en.wikipedia.org/wiki/Object_Pascal

Danke!
type obj = object end;
type cla = class end;
Verwirrend: type cla = class(TObject) end;
Vor vielen Jahren hab ich mir Turbo Pascal 5.5 gekauft. Ich glaube, das war das erste mit OOP. Ich hab mich in OOP aber erst viel später mit Delphi 1 eigelesen.

Antworten