macro knobelei

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

macro knobelei

Beitrag 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!
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: macro knobelei

Beitrag 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 ^^
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: macro knobelei

Beitrag 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")
Signatur und so
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: macro knobelei

Beitrag 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 ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: macro knobelei

Beitrag 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 ;)
Zuletzt geändert von gnasen am 01.10.2012 09:16, insgesamt 2-mal geändert.
pb 4.51
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: macro knobelei

Beitrag 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.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
gnasen
Beiträge: 578
Registriert: 01.08.2007 14:28
Computerausstattung: PB 4.60

Re: macro knobelei

Beitrag 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)
pb 4.51
Derren
Beiträge: 558
Registriert: 23.07.2011 02:08

Re: macro knobelei

Beitrag von Derren »

Jetzt weißt du's ja. Und ich auch ^^
Sonst hätte ich nicht Strings verwendet um die Parameter zu übergeben.
Signatur und so
Antworten