OOP Precompiler und Konstrukte

Für allgemeine Fragen zur Programmierung mit PureBasic.

Wirst du einen OOP-Precompiler mitentwickeln wollen

Ja, brauch ich und habe ich Spass dran
12
38%
Nein, Unsinn und Zeitverschwendung
15
47%
Alles Andere was nicht oben zutrifft
5
16%
 
Insgesamt abgegebene Stimmen: 32

Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

So, beide "Fehler" behoben:
http://www.forgesoft.net/Resources/OOP-Precompiler.zip


Was gibts sonst noch zu meckern? /:->


Kann man das nun ansatzweise als OOP bezeichnen? Vielleicht können wir diesen Precompiler ja weiterentwickeln, wenn bisher alles richtig ist.


Beispiel:
;- Classes
Class OBJECT
a.l
b.w
Declare DummyProc(a,b,c)
EndClass


Class ObjectA
n.l
d.w
Declare TestProc(a,b,c,d)
EndClass



;- Methods
Method DummyProc(a,b,c)
Debug "Summe: "+Str(a+b+c)
EndMethod


Method TestProc(a,b,c,d)
Debug "Summe: "+Str(a+b+c+d)
EndMethod


;------------------------------------


New MyObject.OBJECT

MyObject\DummyProc(1,1,0)


New Test.ObjectA

Test\TestProc(4,1,1,1)
Test\TestProc(4,1,1,1)
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

Irgendwie hab ich das Gefühl, dass deinem Precompiler etwas wichtiges fehlt:
Den Methoden wird keine Instanz der Klasse übergeben (this-Variable).
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Wie meinst du das jetzt(Beispielcode wäre tolll....)?
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

X0r hat geschrieben:Wie meinst du das jetzt(Beispielcode wäre tolll....)?
Deine Klassen haben doch Member-Variablen.
Wie sollen die Methoden jetzt auf diese Zugreifen können, wenn sie nicht die Adresse der Instanz (MyObject.OBJECT / Test.ObjectA) per Parameter übergeben bekommen?
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

Ich hab mal schnell eine Beispielklasse geschrieben. Das ist was ich unter OOP
verstehe:

Code: Alles auswählen

Class XString
  Public:
    s.string
    Constructor(str.s)
    XLeft.s(len)
    XRight.s(len)
    XMid.s(pos, len)
    XTrim.s()
EndClass

Procedure XString\Constructor(str.s)
  *this\s = str
EndProcedure

Procedure.s XString\XLeft(len)
  ProcedureReturn Left(*this\s, len)
EndProcedure

Procedure.s XString\XRight(len)
  ProcedureReturn Right(*this\s, len)
EndProcedure

Procedure.s XString\XMid(pos, len)
  ProcedureReturn Mid(*this\s, pos, len)
EndProcedure

Procedure.s XString\XTrim()
  ProcedureReturn Trim(*this\s)
EndProcedure

;Example

var.XString = New XString(" hello world  ")
Debug var\XLeft(3)
Debug var\XRight(5)
Debug var\XMid(7, 5)
Debug var\XTrim()
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

@Leo:
Stimmt. Wie würde man das in PB realisieren?
Hier ein Code, der vom PreCompiler erstellt wurde. Vielleicht kannst du mir ja helfen:

Code: Alles auswählen

Prototype OBJECT_DummyProc(a,b,c)
Prototype ObjectA_TestProc(a,b,c,d)



Structure OBJECT 
  a.l 
  b.w

DummyProc.OBJECT_DummyProc

EndStructure





Structure ObjectA 
  n.l 
  d.w

TestProc.ObjectA_TestProc

EndStructure


Procedure DummyProc(a,b,c)
MyObject\a=a
Debug "Summe: "+Str(a+b+c)

EndProcedure


Procedure TestProc(a,b,c,d)

Debug "Summe: "+Str(a+b+c+d)

EndProcedure




MyObject.OBJECT


MyObject\DummyProc=@DummyProc()
MyObject\DummyProc(1,1,0) 

MyObject\DummyProc(1,1,0) 

Test.OBJECT


Test\DummyProc=@DummyProc()
Test\DummyProc(1,1,0) 

; IDE Options = PureBasic 4.10 Beta 4 (Windows - x86)
; CursorPosition = 27
; FirstLine = 5
; Folding = -
Leo
Beiträge: 420
Registriert: 26.10.2004 18:26

Beitrag von Leo »

X0r hat geschrieben:@Leo:
Stimmt. Wie würde man das in PB realisieren?
Hier ein Code, der vom PreCompiler erstellt wurde. Vielleicht kannst du mir ja helfen:

Code: Alles auswählen

siehe unten
So ungefähr:

Code: Alles auswählen

Prototype OBJECT_DummyProc(a,b,c,*This.OBJECT)
Prototype ObjectA_TestProc(a,b,c,d,*This.ObjectA)



Structure OBJECT 
  a.l 
  b.w

DummyProc.OBJECT_DummyProc

EndStructure





Structure ObjectA 
  n.l 
  d.w

TestProc.ObjectA_TestProc

EndStructure


Procedure DummyProc(a,b,c,*This.OBJECT)
*This\a=a
Debug "Summe: "+Str(a+b+c)

EndProcedure


Procedure TestProc(a,b,c,d,*This.ObjectA)

Debug "Summe: "+Str(a+b+c+d)

EndProcedure




MyObject.OBJECT


MyObject\DummyProc=@DummyProc()
MyObject\DummyProc(1,1,0,@MyObject) 

MyObject\DummyProc(1,1,0,@MyObject) 

Test.OBJECT


Test\DummyProc=@DummyProc()
Test\DummyProc(1,1,0,@Test) 

; IDE Options = PureBasic 4.10 Beta 4 (Windows - x86)
; CursorPosition = 27
; FirstLine = 5
; Folding = -
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Ja, würde ich auch so meinen. ;)

Dachte es funktioniert, aber irgendwie macht der Precompiler Probleme..

Edit: Ich arbeite dran. Muss jetzt erstmal ein Weg finden, wie ich ne LinkedList in einer LinkedList erstelle :roll:
Benutzeravatar
X0r
Beiträge: 2770
Registriert: 15.03.2007 21:47
Kontaktdaten:

Beitrag von X0r »

Ok, funktioniert jetzt auch:
http://www.forgesoft.net/Resources/OOP-Precompiler.zip


Beispielcode:

Code: Alles auswählen


Class OBJECT 
  a.l 
  b.w
  Declare DummyProc(a,b,c)
  Declare SecondDummyProc(objp)
EndClass







Method DummyProc(a,b,c)

Debug "Summe: "+Str(a+b+c)

EndMethod


Method SecondDummyProc(*this.OBJECT)
Debug *this\a

EndMethod




New MyObject.OBJECT


MyObject\DummyProc(1,1,0)

MyObject\a=1
MyObject\SecondDummyProc(MyObject)  

; IDE Options = PureBasic 4.10 Beta 4 (Windows - x86)
; CursorPosition = 21
; Folding = -

So, was fehlt noch?
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

So, was fehlt noch?
Fehlerermittlung,
Verarbeitung von inkludierten Sources,
Vererbung,
die Möglichkeit zum Composing,
zeilengenaue Fehler-Ausgabe,
das Senden der Source an den Compiler unter adäquater Weitergabe von Commandline-Argumenten,
Ein Delete Keyword (sollte VTable und Object killen),
eine direkte Möglichkeit zum Call von Methoden innerhalb von Methoden.
(Wobei ich da auf ThisVar und This bauen würde, denn anders ist es schwer in PB umzusetzen).

Bis jetzt ist es vom Augenschein geschlossen, nur ein kleiner Konverter.
Willste das nicht lieber Rings und ein paar andere Progger machen lassen die zudem noch Ahnung von OOP haben ?
Nicht dass du dir da jetzt unlösbare Aufgaben auflastest.

MfG
Wolf
Antworten