Cast - Function <-> Object

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

Silver_Knee

Betreff: Cast - Function <-> Object

BeitragMi, Okt 08, 2014 22:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,
kennt jemand nen geschickten Weg ne Funktion zu Object und zurück zu casten? Ich dachte daran Funktionen als Value in ne Map zu stecken und dann wieder herauszuholen.

Normaler Cast code wäre ja sowas in der Art:

BlitzMax: [AUSKLAPPEN]
 Framework BRL.StandardIO
Function sum:Int(a:Int,b:Int)
Return a+b
End Function

Local f:Int(a:Int,b:Int)=sum
Local o:Object=f
Local f2:Int(a:Int,b:Int)=Int(a:Int,b:Int)(o)

Print f2(1,2) ' ergibt 3


Aber BMax kommt da nicht weit. Die Funktion in das Object stecken ist noch drin aber der Cast zurück wird Syntaktisch nicht erkannt oder hab ich da jetzt einen Denkfehler drin?

Alternative wäre halt ein Helfer-Typ. Macht aber wenig Spaß, da für jede Funktionssignatur ein eigener Typ angelegt werden muss.

BlitzMax: [AUSKLAPPEN]
 Framework BRL.StandardIO
Function sum:Int(a:Int,b:Int)
Return a+b
End Function

Local helper=New TIntIntIntFunction
helper._func=sum
Local o:Object=helper
Local helper2:TIntIntIntFunction=TIntIntIntFunction(o)
Local f2:Int(a:Int,b:Int)=helper2._func

Print f2(1,2) ' ergibt 3
Type TIntIntIntFunction
Field _func:Int(a:Int,b:Int)
End Type

BladeRunner

Moderator

BeitragMi, Okt 08, 2014 22:18
Antworten mit Zitat
Benutzer-Profile anzeigen
Schon Funktion zu objekt scheitert, er meckert nur an der falschen stelle bei deinem Testcode.
Sobald Du die Zeile die das Objekt in ein Funktion zurückcasten soll auskommentierst wird das ersichtlich.
Ein Functionpointer ist eben kein Objekt, sondern ein Pointer.
Ich fürchte ohne die Gluelogic deines Helpers wirst Du da nicht weiter kommen.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Silver_Knee

BeitragMi, Okt 08, 2014 23:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Na gut. Eigentlich schade, in manchen Programmiersprachen ist eine Funktion auch ein Objekt.

BladeRunner

Moderator

BeitragMi, Okt 08, 2014 23:57
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe beim Suchen eine Lösung gefunden, die allerdings mit Vorsicht zu geniessen ist.
Es ist auch kein Object-Cast, sondern arbeitet mit einem Array aus Byte Pointern.
Wie man sieht kann man so die Funktionen auch mit völlig falschen Argumenttypen beliefern, es ist also fehleranfällig:
Code: [AUSKLAPPEN]
SuperStrict

Function func0:Int(MSG:String)
   Print "Function 0 says, ~q"+MSG+"~q"
End Function

Function func1:Int(MSG:String ,stuff:Int)
   Print "Function 1 says, ~q"+MSG+"~q"+stuff
End Function

Function func2:Int(MSG:Int)
   Print "Function 2 says, ~q"+MSG+"~q"
End Function

Function func3:Int(MSG:String)
   Print "Function 3 says, ~q"+MSG+"~q"
End Function

Local funcs:Byte Ptr[4]
funcs[0]=func0
funcs[1]=func1
funcs[2]=func2
funcs[3]=func3

For Local func:Byte Ptr=EachIn funcs
   Local _func(MSG$,stuff:Int)=func
   _func("Hello!",1)
Next


Local map:TMap = New TMap
map.insert("Func0" , String("0") )
map.insert("Func1" , String("1") )
map.insert("Func2" , String("2") )
map.insert("Func3" , String("3") )
Local str:String = Input("Which Func to run? ")
Local func:Int(MSG:String) = funcs[Int(String(map.ValueforKey(str)) )]
func("Hello")


Edit: Habe den Code um eine Map erweitert, es geht halt nur mit dem Umweg über das Array. Die Values in der Map sind die Positionen im Array als String gespeichert.

Edit2: Mal ein Beispiel, du kannst per Input wählen welche Function ausgeführt wird. Bei einer nicht-validen Eingabe wird Func0 aufgerufen, sie kann also als default-Zweig benutzt werden. Vorsicht: Case Sensitive!
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

Silver_Knee

BeitragDo, Okt 09, 2014 23:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Nice. Jetzt wäre auch ein Helfer Typ nicht mehr so schlimm. Man brauch ja nur einen für den Byte Ptr. Der könnte dann sogar noch Signaturinformationen von der Funktion enthalten. Wäre ne schöne Erweiterung für die Reflections: Eine Map mit Helfer-Typen für jede Funktion im Programm alla Function.ForName.

Edit: ich hab übrigens den weg jetzt so umgesetzt:
Function -> Byte Ptr -> Int -> String -> Object
Und das geht auch wieder zurück. Der letzte Schritt vom Pointer zur Funktion ist halt gefährlich weil man die Parameter kennen muss.

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group