Seite 1 von 1

Macro und Module

Verfasst: 20.02.2014 17:05
von CSHW89
Hi Leute,

ich musste gerade feststellen, dass Module in Macros wohl nicht so ganz funktionieren. Zumindest finde ich das folgende Verhalten von PB schon recht komisch. Mag auch an falscher Denkweise meinerseits liegen, aber normalerweise hab ich mit Macros keine Schwierigkeiten. Sehe hier gleich zwei Bugs...

Meiner Meinung sollte folgender Code schon funktionieren:

Code: Alles auswählen

Macro InitContainer(_type_)
  DeclareModule Container#_type_
    
    Structure struc
      List elements._type_()
    EndStructure
    
  EndDeclareModule
  
  Module Container#_type_
  EndModule
  
EndMacro

Macro InitStack(_type_)
  InitContainer(_type_)
  
  Structure struc Extends Container#_type_::struc  ;; <<<==== HIER
  EndStructure
EndMacro

InitStack(Integer)
Anscheinend ersetzt PB an der Stelle 'HIER' das '_type_' nicht durch 'Integer'. Wenn ich das provisorisch mal da hinschreibe...:

Code: Alles auswählen

Macro InitContainer(_type_)
  DeclareModule Container#_type_
    
    Structure struc
      List elements._type_()
    EndStructure
    
  EndDeclareModule
  
  Module Container#_type_
  EndModule
  
EndMacro

Macro InitStack(_type_)
  InitContainer(_type_)
  
  Structure struc Extends ContainerInteger::struc
  EndStructure
EndMacro

InitStack(Integer)
... sagt PB nun, dass das Modul ContainerInteger nicht deklariert wurde. Dies müsste der Compiler aber zuvor gesehen haben, da meiner Meinung InitContainer zuerst ersetzt und kompiliert werden müsste.
Wenn ich das InitContainer dann raus nehme aus dem Macro und vor dem InitStack schreibe (was meiner Meinung exakt den gleichen Code entsprechen müsste)...:

Code: Alles auswählen

Macro InitContainer(_type_)
  DeclareModule Container#_type_
    
    Structure struc
      List elements._type_()
    EndStructure
    
  EndDeclareModule
  
  Module Container#_type_
  EndModule
  
EndMacro

Macro InitStack(_type_)
  
  Structure struc Extends ContainerInteger::struc
  EndStructure
EndMacro

InitContainer(Integer)
InitStack(Integer)
... funktioniert es. Allerdings finde ich das nicht wirklich zufrieden stellend.
Hab ich da doch ein Denkfehler, oder funktionieren Module in Macro zur Zeit einfach nicht?

lg Kevin


edit: Ach ja, ganz vergessen: Win7 64-Bit, PB 5.21 32-Bit

Re: Macro und Module

Verfasst: 20.02.2014 20:38
von Chimorin
Ôhm, ist doch richtig, dass es das nicht gibt. Ich hab noch nie gehört, dass man den Namen von irgendwas (Variable etc.) wâhrend der Laufzeit verändern kann... Klärt mich bitte auf. Wäre ja cool, wenn das gehen würde.

Re: Macro und Module

Verfasst: 20.02.2014 20:51
von Danilo
CSHW89 hat geschrieben:Meiner Meinung sollte folgender Code schon funktionieren:

Code: Alles auswählen

Macro InitContainer(_type_)
  DeclareModule Container#_type_
    
    Structure struc
      List elements._type_()
    EndStructure
    
  EndDeclareModule
  
  Module Container#_type_
  EndModule
  
EndMacro

Macro InitStack(_type_)
  InitContainer(_type_)
  
  Structure struc Extends Container#_type_::struc  ;; <<<==== HIER
  EndStructure
EndMacro

InitStack(Integer)
Wenn Du nach '#_type_' noch ein '#' schreibst, wird es richtig zusammen gefügt.

Code: Alles auswählen

Macro InitContainer(_type_)
  DeclareModule Container#_type_
    
    Structure struc
      List elements._type_()
    EndStructure
    
  EndDeclareModule
  
  Module Container#_type_
  EndModule
  
EndMacro

Macro InitStack(_type_)
  InitContainer(_type_)
  
  Structure struc Extends Container#_type_#::struc  ;; <<<==== HIER noch ein # nach _type_
  EndStructure
EndMacro

InitStack(Integer)

x.struc
Debug ListSize( x\elements() )
AddElement( x\elements() )
Debug ListSize( x\elements() )

y.ContainerInteger::struc
Debug ListSize( y\elements() )
AddElement( y\elements() )
Debug ListSize( y\elements() )

Re: Macro und Module

Verfasst: 20.02.2014 21:01
von CSHW89
@Bananenfreak: Nein, hier wird nichts zur Laufzeit verändert. Das erste Codebeispiel sollte eigentlich funktionieren.

@Danilo: Vielen Dank :allright: . Ist aber meiner Meinung schon ein Bug, da das '#' eigentlich nur zwischen Wörtern geschrieben werden muss. In so einem Fall wäre es ja z.B. falsch:

Code: Alles auswählen

Macro test(_param_)
  a = 1+#_param_
EndMacro
test(2)
Aber egal, ich bin glücklich, dass es zumindest ein "Workaround" dafür gibt.

lg Kevin

Re: Macro und Module

Verfasst: 21.02.2014 10:38
von Chimorin
Achso, klar, Makros werden ja vor dem Kompillieren wieder eingefügt. :doh:

Wie gut, dass es dazu in der Hilfe nur 2 Sätze gibt, aber kein einfaches Beispiel.