Seite 1 von 1

Parameter/Funktion überladen

Verfasst: 29.08.2020 21:55
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

Re: Parameter/Funktion überladen

Verfasst: 31.08.2020 10:10
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.

Re: Parameter/Funktion überladen

Verfasst: 31.08.2020 10:24
von mk-soft
Für Windows den Parameter Type Variant, oder ein eigenen strukturieren Datentype anlegen.

Re: Parameter/Funktion überladen

Verfasst: 31.08.2020 17:27
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.

Re: Parameter/Funktion überladen

Verfasst: 09.10.2020 22:09
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.

Re: Parameter/Funktion überladen

Verfasst: 09.10.2020 23:22
von Kurzer
Danke GPI. :allright:
Dass "" + Ziffer funktioniert (und die Zahl in einen String castet) habe ich nicht erwartet. :shock: