Seite 5 von 9

Verfasst: 24.10.2007 19:51
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)

Verfasst: 24.10.2007 22:12
von Leo
Irgendwie hab ich das Gefühl, dass deinem Precompiler etwas wichtiges fehlt:
Den Methoden wird keine Instanz der Klasse übergeben (this-Variable).

Verfasst: 24.10.2007 22:18
von X0r
Wie meinst du das jetzt(Beispielcode wäre tolll....)?

Verfasst: 24.10.2007 22:23
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?

Verfasst: 24.10.2007 22:35
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()

Verfasst: 24.10.2007 22:40
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 = -

Verfasst: 24.10.2007 22:58
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 = -

Verfasst: 24.10.2007 23:03
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:

Verfasst: 24.10.2007 23:23
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?

Verfasst: 24.10.2007 23:34
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