Seite 1 von 1

macro knobelei

Verfasst: 30.09.2012 17:03
von gnasen
Hi Leute,
ich möchte ein stückchen Code durch ein macro vereinfachen, komme aber gerade nicht auf eine gute Idee. Es geht um folgende Situation

Code: Alles auswählen

;platzhalter für eine wichtige andere Funktion. Wurde nur eingeführt damit der code kompilierbar ist!
Procedure anwendung(Name.s, proc.i)
EndProcedure

;/ die folgenden zwei Beispiele sind exemplarisch für die Codesituation und sollen durch ein macro erleichtert werden!

Procedure test1(a.i)
  Debug a
EndProcedure
anwendung("test1", @test1())  
myString$ + "Procedure test1(a.i) : EndProcedure" + #lf$

Procedure test2(a.i,b.i)
  Debug a
  Debug b
EndProcedure
anwendung("test2", @test2())  
myString$ + "Procedure test2(a.i,b.i) : EndProcedure" + #lf$
Da sich doch viel wiederholt denke ich da sollte sich eine schöne Lösung mit einem Macro finden lassen. Für jegliche Ideen bin ich dankbar!

Re: macro knobelei

Verfasst: 30.09.2012 17:32
von STARGÅTE
Ich vermute mal das test1() und test2() in wirklichkeit auch mehr "drin" haben richtig?

Von daher würde ich folgendes Macro vorschlagen:

Code: Alles auswählen

Macro _DQ_ :
 " 
EndMacro

Macro DefineProcedure(Name, Parameters)
	Declare Name#Parameters
	anwendung(_DQ_#Name#_DQ_, @Name())
	myString$ + "Procedure "+_DQ_#Name#Parameters#_DQ_+" : EndProcedure" + #LF$
	Procedure Name#Parameters
EndMacro


;platzhalter für eine wichtige andere Funktion. Wurde nur eingeführt damit der code kompilierbar ist!
Procedure anwendung(Name.s, proc.i)
	Debug Name
EndProcedure

;/ die folgenden zwei Beispiele sind exemplarisch für die Codesituation und sollen durch ein macro erleichtert werden!

DefineProcedure(test1, (a.i))
  Debug a
EndProcedure

DefineProcedure(test2, (a.i,b.i))
  Debug a
  Debug b
EndProcedure

Debug myString$
test2(1,2)
So wird mit DefineProcedure sowohl dein String gefüllt, anwendung() ausgeführt und die Prozedur selbst definiert.
Bitte nicht über den Syntax wundern, Wenn Macros benutzt werden, sind manchmal "eigenartige" Dinge möglich/notwendig ^^

Re: macro knobelei

Verfasst: 30.09.2012 17:36
von Derren
Stargate war mal wieder schneller und hat wahrscheinlich auch die elegantere Lösung.

Code: Alles auswählen

Procedure anwendung(Name.s, proc.i)
	Debug Name
	Debug proc
	Debug "---"
	
EndProcedure

  Macro DoubleQuote
    "
  EndMacro  
  
Macro myMacro(_ProcName_, _Param_)	
	anwendung(DoubleQuote#_ProcName_#DoubleQuote, @_ProcName_())
	myString$ + "Procedure "+DoubleQuote#_ProcName_#DoubleQuote+"("+_Param_+") : EndProcedure" + #LF$
EndMacro 	

Procedure test1(a.i)
  Debug a
EndProcedure
myMacro(test1, "a.i")

Procedure test2(a.i,b.i)
  Debug a
  Debug b
EndProcedure
myMacro(test2, "a.i, b.i")

Re: macro knobelei

Verfasst: 30.09.2012 17:50
von STARGÅTE
Aber bei deiner Lösung kann ich noch den ProcedureReturn-Typ (für Test1 und test2) festlegen, das geht bei mir nicht mehr, da wäre alles immer .i
Dann müsste mein Macro ggf. noch ein 3. Parameter bekommen in dem dann i, f oder s drin steht ...

Re: macro knobelei

Verfasst: 30.09.2012 21:39
von gnasen
hey danke, ich habe folgendes erst gar nicht ausprobiert, da ich nicht gedacht hätte das das funktioniert:

Code: Alles auswählen

Macro test(blub)
  debug blub
EndMacro

test((1+2))
Danke für die Beispiele, ich unterschätze die Macht der Macros immer ein wenig ;)

Re: macro knobelei

Verfasst: 30.09.2012 22:52
von STARGÅTE
Die "Macht" von Macros ist eigentlich zimlich primitiv, denn es wird ja nur der Inhalt eines Parameter exakt in den Code des Macros kopiert.
Wenn man das "verinnerlicht", hat man selbst einfluss auf die Macht von Macros, z.B. wie Derren, ich und andere mit dem DoubleQuote-Macro um Strings aus Parametern zu erzeugen.

Manchmal ist es dabei nützlich, wenn man ein Syntaxfehler mit einbaut, um die Aufgabe des Macros zu sehen.

Re: macro knobelei

Verfasst: 01.10.2012 09:17
von gnasen
Huppsa, hatte eigentlich ein ganz anderes Bsp für Sachen, von denen ich nicht vermutet hätte, dass die Syntaxmäßig gehen, posten wollen, nämlich dieses hier:

Code: Alles auswählen

Macro test(blub)
  
  Procedure bla#blub
  EndProcedure
  
EndMacro

test((a.i,b.i)) ;<---- diese Stelle

bla(1,2)

Re: macro knobelei

Verfasst: 01.10.2012 18:02
von Derren
Jetzt weißt du's ja. Und ich auch ^^
Sonst hätte ich nicht Strings verwendet um die Parameter zu übergeben.