![]() |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Von mir aus dann eben TMyClass.CreateManaged() oooder in TObject bereits einen Parameter einführen: TObject.Create(isManaged: Boolean); :P
Letztlich gehopst wie gesprungen, wobei ich die syntaktische Unschönheit von new nachfühlen kann. Die Alternative mit Parameter oder Benamung hätte nur ggf. den Nachteil, dass man die Eindeutigkeit in Ableitungen sehr leicht (und fahrlässig) verschleiern könnte, und man es der IDE beim Unterscheiden zusätzlich schwer machen würde. (Sie müsste schon regelrechte Interpreterfähigkeiten bekommen, aber vielleicht wäre das ja mal ein Anreiz die IDE-Features mehr an den Compiler zu knurpseln als z.B. das dolle ErrorInsight oder wie sich die vielen falschen roten Unterwellungen schimpfen, die scheinbar eher selten Plan von der Projektstruktur haben.) Oder, wobei ich das so garnicht mag: Annotations. Wobei diese dann in die Klassendeklaration gehörten, und somit die GC-Bindung nur per Klasse (und all ihrer Nachfahren) gegeben wäre, und man nicht die Freiheit hätte von Instanz zu Instanz zu unterscheiden. Eher bäh. |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Drum meinte ich ja, im Falle von
Delphi-Quellcode:
würde der Compiler dann Standard-Constructor "Create" aufrufen, sich einen Suchen, welche den übergebenen Parametern entspricht, falls es diesen gibt und am Ende es zu einem
bar := new TMyFooClass();
Delphi-Quellcode:
umwandeln.
bar := TMyFooClass.Create();
Und schon wäre das OOP-Prinzip gewahrt. Nur wird es eben schwer einen neues "reserviertes Wort" einzuführen. Das ist wohl auch der Grund, warum es "Class Helper" und nicht nur "Helper" heißt, da durch das reservierte "Class" das Helper geschützt/eingeleitet wird, womit die Syntax dennoch kompatibel bleibt. Wenn man eine Syntax von Grund auf neu baut, könnte man z.B. NEW gleich reservieren. Mit den großen Neuerungen und vielen Änderungen seitens D2009/XE2 hätte man diesbezüglich schnell noch ein paar neue "reservierte" Wörter mit einführen und alte Makel in der Syntax ausbessern können. Wenn sowieso genug angepaßt werden muß, dann kommt es auf die paar Änderungen auch nicht mehr an. :twisted: Sowas wäre syntaktisch möglich:
Delphi-Quellcode:
genauso wie ja auch sowas gehn:
type
TMyClass = class managed(Txyz) end;
Delphi-Quellcode:
type
TMyClass = class sealed(Txyz) end; TMyClass = class abstract(Txyz) end; |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
So... es wird Zeit, dass ich mich auch mal in diese Diskussion einmische. :mrgreen:
Zitat:
Delphi-Quellcode:
oder Pointer auf Records)), anderseits arbeiten "Unit basierte" Compiler wie FPC und Delphi so, dass sie sich beim Kompilieren einer weiteren Unit erst nur den Interface Teil der Unit anschauen müssen, um festzustellen, ob sich was geändert hat und demnach die erste Unit neukompiliert werden muss. Wenn du nun Teile des Implementationbereichs in den Interfacebereich schiebst, so muss der Compiler auch über diese Teile hinweg parsen, selbst wenn er sie eventuell gar nicht benötigt, weil sich nichts geändert hat.
forward
Ganz davon abgesehen ist das mit Interface und Implementation Anfängern einfacher zu erklären als "also wenn du da jetzt noch auf eine private Variable der Unit zugreifen möchtest, dann musst du vor diesem Public Abschnitt noch einen Private Abschnitt einfügen" Zitat:
Nichtsdestotrotz: Free Pascal unterstützt nicht-referenzgezählte Interfaces (so genannte CORBA Interfaces). Die kannst du (per Unit oder eventuell sogar lokal per Deklaration, das weiß ich grade nicht) ganz einfach per "{$interfaces corba}" aktivieren. Du deklarierst dann ganz einfach dein Interface, diese leiten dann jedoch NICHT von IInterface/IUnknown ab (um genau zu sein haben die dann gar keinen Vorfahrn) und benötigen auch keine Implementierungen für QueryInterface, AddRef und Release. Seit FPC 2.4.0 funktionieren die sogar ähnlich wie COM Interfaces hinsichtlich "as" und so (aber eben ohne Referenzzählung). Zu deinem a): Dies wäre ein Feature, dem ich eventuell sogar eine gewisse Sinnhaftigkeit zugestehen könnte (ich arbeite nur selten mit Interfaces, deswegen...). Solche Interfaces kannst du dann natürlich nur in Pascal Code einsetzen, da zum Beispiel ein C++ Code, welcher dieses Interface verwendet, nicht wissen kann wie er auf die Property zugreift (außer man streut hier sehr viel Compilermagic ein...) Zu deinem b): Das Problem hierbei ist die Referenzzählung. Delphi und FPC fügen nur Code zum Ändern der Referenzzählung ein, wenn es sich um eine Interface Referenz handelt. Also rein prinzipiell könntest du sie sogar mischen, wenn du manuell mit AddRef und Release auf der Objektreferenz arbeitest... (nicht dass das unbedingt das sinnvollste ist, aber es würde gehen) Falls du dich jedoch darauf beziehst, dass du einer Objektreferenz keine Interfacereferenz zuweisen kannst, dann hat das den Hintergrund, dass ein Interface ja von unterschiedlichen Klassen implementiert werden kann. Diese Klassen müssen dabei ja nichteinmal verwandt sein. Also eine automatische Konvertierung würde ich da gar nicht wollen. AFAIK unterstützen jedoch modernere Delphi Versionen (XE+?) ein "as", um von Interfaces auf Objekte zu casten und wenn das nicht geht wird eine Exception geworfen (wie von "as" gewohnt). Vielleicht gibt es da auch ein "is", das weiß ich gerade nicht. Das wären auf jeden Fall zwei Features, die zu FPC hinzugefügt werden könnten/sollten. Zitat:
[QOUTE][*]Man kann zwar mehrere verschiedene benannte Destruktoren deklarieren, das hilft aber nichts, weil Free immer nur einen ganz bestimmten aufruft. Wozu haben wir denn unser schönes Benennungsfeature?[/LIST] Und es funktioniert auch wie es soll. "Free" ist nur eine normale Prozedur deren einziger Sinn es ist zu überprüfen, ob "Self <> Nil" ist und dann den Default-Destruktor "Destroy" aufruft. Nichts hält mich davon ab einen Destruktor mit einem anderen Namen zu definieren und einfach direkt aufzurufen. Es ist nämlich der Aufruf des Destruktors, der die Speicherfreigabe veranlasst, nicht der von Free (sonst bräuchten wir ja kein spezielles Keyword für den Destruktor).
Delphi-Quellcode:
Schematypen stehen bei mindestens einem FPC-Entwickler auf der Wunschliste.
type
// Schema-Typ, wie in GPC: TCharArray(start, length: Integer) = array [start..start+length] of char; TSample = TCharArray(0,6); Weil's grad zum Kontext passt noch der Einwurf Himitsus dazu: Zitat:
Zitat:
Delphi-Quellcode:
Der Compiler muss den Punkt "TTest<5" nun irgendwie intelligent behandeln. Es kann vielleicht schaffbar sein, aber wenn ich mir allein den Code anschau, den ich geschrieben habe, um die Inlinespezialisierung "TTest<SomeType>" zu erlauben, dann möchte ich nicht wissen, was ich da alles verbrechen muss (und dabei hab ich es noch nichteinmal geschafft die Überladung mit einer Variable zu implementieren, das steht noch auf meiner ToDo Liste, weil's (hoffentlich) ein extremes Randbeispiel ist).
type
TTest<const c> = class end; var TTest: Integer; // was ja erlaubt ist in Delphi! (in FPC funktioniert das noch nicht...) begin if TTest<5>.Irgendwas then ... end. Zitat:
Zitat:
Delphi-Quellcode:
type
TSomeClassHelper<T> = class helper for TObject function ReturnDefault: T; // mir fällt grad nichts besseres ein end; function TSomeClassHelper.ReturnDefault; begin Result := Default(T); end; type TSomeClassHelperInteger = TSomeClassHelper<Integer>; var i: Integer; ... i := SomeObject.ReturnDefault; ... Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
sollte es doch tun, oder nicht?
&String
Zitat:
Zitat:
Zitat:
Zitat:
Delphi-Quellcode:
Dass ich da Klammern setzen muss, hat mich schon immer aufgeregt...
if not (SomeEnum in SomeSet) then
// vs if not SomeEnum in SomeSet then Zitat:
Delphi-Quellcode:
fusst darauf, dass genau das eben nicht geht!
if TSomeGeneric<SomeType>.BlaBla
Zitat:
![]() Zitat:
Zitat:
Delphi-Quellcode:
Wie gut das funktionieren würde, wenn man Objekte über Prozeduren hinweg reicht, weiß ich noch nicht, aber es wäre vielleicht eine Idee...
var
bar: TMyFooClass autoref; begin bar := TMyFooClass.Create; ... // bar wird automatisch freigegeben, falls keine Referenz darauf mehr existiert (die Überprüfung hierzu ist jedoch schwierig) end; Zitat:
Delphi-Quellcode:
type
TSomeRefCountedObject = class refcounted (TParentClass) // in dieser Reihenfolge, um analog zu "sealed" und "abstract" zu sein end; Zitat:
Und was ich mir wünsche (und vielleicht auch mal implementieren werde):
So... Ende der langen Liste :P Gruß, Sven |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
Zitat:
|
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Zitat:
Zitat:
Zitat:
Zitat:
Gruß, Sven |
Dieses Thema wurde am "12. Jan 2012, 17:07 Uhr" von "TBx" aus dem Forum "Programmieren allgemein" in das Forum "Software-Projekte der Mitglieder" verschoben.
|
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Zitat:
Auch wenn man jetzt das IN vorrangig behandeln würde, wäre das keine Lösung, da sich dann Andere wieder beschweren würden, weil plötzlich was Anderes nicht mehr ginge. Zitat:
Ich weiß nichtmal, warum man STRING so behandeln mußte? Und wenn, warum ist dann Integer, Boolean und Co. nicht auch fett? :gruebel: Zitat:
Zitat:
Delphi-Quellcode:
In diesen schon vorhandenen Funktionen muß man nur noch schauen, ob in der RTTI des Records die neuen Operatoren stehen und ruft sie dann auf.
var
X, Y: TMyRecord; begin << X und Y werden initialisiert (wenn dort bestimmte Typen drauf sind) Y := X; << es wird eine Kopierfunktion aufgerufen, welche den Record kopiert end; << es wird eine Funktion aufgerufen, welche den Record freigibt Es gibt schon seit langem einen EDN.Eintrag von mir, aber auf mich hört ja keiner. (vorallem da es keine großen Änderungen mit sich zieht) |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Zitat:
Die Bitweisen möchte man halt gerne stark binden und die Booleschen schwach. Intuitiv würde ich aber auch eher immer annehmen, das ein boolescher Operator gemeint ist. Wer mit bitweisen Operatoren werkelt, kann auch ein paar Klammern mehr vertragen :wink: Oder wie wäre es mit lnot, land, lor :stupid: |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Zitat:
Zitat:
Delphi-Quellcode:
type
String42 = String[42]; Zitat:
Zitat:
Diese Ereignisse wären aber durchaus interessant, das müsste ich mir mal im FPC anschauen, was man da machen könnte. Gruß, Sven |
AW: Störende Elemente der Delphi-Syntax / Vorschläge für neuen Dialekt
Zitat:
Das traurige ist ja, dass entsprechende Funktionen zum Finalisieren von Records und Arrays ja bereits vorhanden sind – sieht man auch im Assembler-Code. Nur leider gibt es keine Möglichkeit, sich dort einzuklinken. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:10 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