Parameter/Funktion überladen

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Parameter/Funktion überladen

Beitrag von Kurzer »

Da es in PB kein "Function overloading" gibt, (also das Aufrufen der selben Prozedur mit unterschiedlichen Parametertypen) habe ich mir hierfür folgende Krücke gebaut. Evtl. kann man das ja noch verbessern?

Code: Alles auswählen

Macro MyFunc(param1, param2)
   _MyFunc(#DQUOTE$ + param1 + #DQUOTE$, #DQUOTE$ + param2 + #DQUOTE$)
EndMacro

Macro IsNumber(value)
   Bool(Trim(value, #DQUOTE$) = Str(Val(Trim(value, #DQUOTE$))))
EndMacro

Macro ToNumber(value)
   Val(Trim(value, #DQUOTE$))
EndMacro
 
Macro ToString(value)
   Trim(value, #DQUOTE$)
EndMacro

Procedure _MyFunc(Param1.s, Param2.s)
   If IsNumber(Param1)
      Debug "Number: " + ToNumber(Param1)
   Else
      Debug "String: " + ToString(Param1)
   EndIf
   
   If IsNumber(Param2)
      Debug "Number: " + ToNumber(Param2)
   Else
      Debug "String: " + ToString(Param2)
   EndIf
EndProcedure

MyFunc("title", "My window title")
MyFunc("width", 350)
MyFunc("height", 600)
MyFunc(33, 600)
Markus
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: Parameter/Funktion überladen

Beitrag von #NULL »

Nett, nur leider nicht sehr performant. Und es wird ja auch nicht wirklich der Datentyp erkannt sondern nur die Daten, und das Trim() ist zu gierig 8)

Code: Alles auswählen

MyFunc("33", 600)                                  ; "33" identified as number
MyFunc(~"quote: \"this is a quoted text\"", 600)   ; end dqoute trimmed
Es gibt ja auch TypeOf(), aber leider nicht für Literale, und ein mehrzeiliges Macro würde auch Rückgabewerte schwierig machen.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Parameter/Funktion überladen

Beitrag von mk-soft »

Für Windows den Parameter Type Variant, oder ein eigenen strukturieren Datentype anlegen.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Parameter/Funktion überladen

Beitrag von Kurzer »

@#Null, ja wie gesagt ist das nur eine Krücke. Was anderes ist mir bisher nicht eingefallen und für meinen Zweck war die Unterscheidung zw. numerische Ganzahl und String ausreichend.

@mk-soft: Ich brauchte das für ein SpiderBasic Projekt, da gibt es leider keine Pseudotypes.
Wie meinst du das mit dem strukturierten Datentypen? Meinst du, dass man vor dem Prozeduraufruf noch eine strukturierte Variable anlegt und entsprechend füllt? Das habe ich verworfen, weil mir das zu weit weg ist von einem einfachen Prozeduraufruf.
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: Parameter/Funktion überladen

Beitrag von GPI »

Code: Alles auswählen


Macro MyFunc(param1, param2)
   _MyFunc("" + param1 , "" + param2 )
EndMacro

Macro IsNumber(value)
   Bool(value = Str(Val(value)) )
EndMacro

Macro ToNumber(value)
   Val(value)
EndMacro
 
Macro ToString(value)
   value
EndMacro

Procedure _MyFunc(Param1.s, Param2.s)
   If IsNumber(Param1)
      Debug "Number: " + ToNumber(Param1)
   Else
      Debug "String: " + ToString(Param1)
   EndIf
   
   If IsNumber(Param2)
      Debug "Number: " + ToNumber(Param2)
   Else
      Debug "String: " + ToString(Param2)
   EndIf
EndProcedure

MyFunc("title", "My window title")
MyFunc("width", 350)
MyFunc("height", 600)
MyFunc(33, 600)
ein bischen einfacher - und löst das quotes-Problem.
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
Benutzeravatar
Kurzer
Beiträge: 1617
Registriert: 25.04.2006 17:29
Wohnort: Nähe Hamburg

Re: Parameter/Funktion überladen

Beitrag von Kurzer »

Danke GPI. :allright:
Dass "" + Ziffer funktioniert (und die Zahl in einen String castet) habe ich nicht erwartet. :shock:
"Never run a changing system!" | "Unterhalten sich zwei Alleinunterhalter... Paradox, oder?"
PB 6.02 x64, OS: Win 7 Pro x64 & Win 11 x64, Desktopscaling: 125%, CPU: I7 6500, RAM: 16 GB, GPU: Intel Graphics HD 520
Useralter in 2024: 56 Jahre.
Antworten