Ich hätte da auch noch was für TypeOf():
Leider hab ich noch keine Möglichkeit gefunden wie man auf diese Weise noch Rückgabewerte hinzufügen könnte.
Code: Alles auswählen
EnableExplicit
Procedure TypEgal_Long(a.l)
Debug "Das war ein Long: " + a
EndProcedure
Procedure TypEgal_Integer(a.l)
Debug "Das war ein Integer: " + a
EndProcedure
Procedure TypEgal_Float(a.f)
Debug "Das war ein Float: " + a
EndProcedure
Procedure TypEgal_Quad(a.q)
Debug "Das war ein Quad: " + a
EndProcedure
Procedure TypEgal_String(a.s)
Debug "Das war ein String: " + a
EndProcedure
Procedure TypEgal_Simple(a.i)
Debug "Das war ein fester Wert, interpretiert als Integer: " + a
EndProcedure
Macro TypEgal(a)
CompilerIf Defined(a, #PB_Variable)
CompilerSelect TypeOf(a)
CompilerCase #PB_Long
TypEgal_Long(a)
CompilerCase #PB_Integer
TypEgal_Integer(a)
CompilerCase #PB_Float
TypEgal_Float(a)
CompilerCase #PB_Quad
TypEgal_Quad(a)
CompilerCase #PB_String
TypEgal_String(a)
CompilerEndSelect
CompilerElse
TypEgal_Simple(a)
CompilerEndIf
EndMacro
Define l.l, i.i, f.f, q.q, s.s
l = 1234
i = 5678
f = 0.1234
q = 12345678901234
s = "Test"
TypEgal(l)
TypEgal(i)
TypEgal(f)
TypEgal(q)
TypEgal(s)
TypEgal(123)
;TypEgal("asdf") ;geht leider nicht bzw. ich wüsste noch nicht wie.
Und hier noch ein etwas praktischeres Beispiel mit angetäuschter Operatorüberladung mittels Makros.

Wundert euch nicht über dieses 'EndMacro' nach jedem 'VectorOp()'. Irgendwie ging es nicht anders...
Code: Alles auswählen
EnableExplicit
Structure Vector
x.f
y.f
z.f
EndStructure
Macro MacroRo
ro
EndMacro
Macro VectorOp(op, opName)
Procedure Vector#opName#Vector(*a.Vector, *b.Vector)
*a\x op *b\x
*a\y op *b\y
*a\z op *b\z
EndProcedure
Procedure Vector#opName#Skalar(*a.Vector, b.f)
*a\x op b
*a\y op b
*a\z op b
EndProcedure
Mac#MacroRo Vector#opName(a, b)
CompilerIf Defined(a, #PB_Variable) ;Ist a eine Variable?
CompilerIf Defined(b, #PB_Variable) ;Ist b eine Variable?
CompilerIf TypeOf(b) = #PB_Structure
CompilerIf TypeOf(a) = #PB_Structure
Vector#opName#Vector(a, b) ;a und b sind vom Typ Vector
CompilerElse
Vector#opName#Skalar(b, a) ;b ist vom Typ Vector und a eine normale Variable
CompilerEndIf
CompilerElse
CompilerIf TypeOf(a) = #PB_Structure
Vector#opName#Skalar(a, b) ;a ist vom Typ Vector und b eine normale Variable
CompilerElse
CompilerError "VectorMul(Float, Float): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
CompilerEndIf
CompilerEndIf
CompilerElse
CompilerIf TypeOf(a) = #PB_Structure
Vector#opName#Skalar(a, b) ;a ist vom Typ Vector und b ein fester Wert
CompilerElse
CompilerError "VectorMul(Float, Constant): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
CompilerEndIf
CompilerEndIf
CompilerElse
CompilerIf Defined(b, #PB_Variable) ;Ist b eine Variable?
CompilerIf TypeOf(b) = #PB_Structure
Vector#opName#Skalar(b, a) ;b ist vom Tyo Vector und a ein fester Wert
CompilerElse
CompilerError "VectorMul(Constant, Float): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
CompilerEndIf
CompilerElse ;a und b sind keine Variablen -> Fehler
CompilerError "VectorMul(Constant, Constant): Mindestens ein Parameter von VectorMul() muss ein Vector sein."
CompilerEndIf
CompilerEndIf
; EndMac#MacroRo
EndMacro
VectorOp(*, Mul)
EndMacro
VectorOp(+, Add)
EndMacro
VectorOp(/, Div)
EndMacro
VectorOp(-, Sub)
EndMacro
; Ab hier gibt es jetzt folgende Procedures:
; - VectorMulVector(*a.Vector, *b.Vector)
; - VectorMulSkalar(*a.Vector, b.f)
; - VectorAddVector(*a.Vector, *b.Vector)
; - VectorAddSkalar(*a.Vector, b.f)
; - VectorDivVector(*a.Vector, *b.Vector)
; - VectorDivSkalar(*a.Vector, b.f)
; - VectorSubVector(*a.Vector, *b.Vector)
; - VectorSubSkalar(*a.Vector, b.f)
;
; Dank den folgenden vier weiteren Makros, braucht man sich um diese Procedures aber nicht mehr zu kümmern:
; - VectorMul(a, b)
; - VectorAdd(a, b)
; - VectorDiv(a, b)
; - VectorSub(a, b)
Define a.Vector, b.Vector, c.f
a\x = 1 : a\y = 2 : a\z = 3
b\x = 1 : b\y = 2 : b\z = 3
c = 4
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
Debug "b = (" + b\x + ", " + b\y + ", " + b\z + ")"
Debug "c = " + c
VectorAdd(a, b) ;Vector + Vector
Debug "a + b"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
VectorMul(c, a) ;Skalar * Vector
Debug "c * a"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
VectorDiv(a, c) ;Vector / Skalar
Debug "a / c"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
VectorSub(a, b) ;Vector - Vector
Debug "a - b"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
VectorMul(a, 4) ;Vector * 4 ;Leider gehen hier wieder keine Fließkommazahlen, sehr wohl aber Ganzzahlen
Debug "a * 4"
Debug "a = (" + a\x + ", " + a\y + ", " + a\z + ")"
;Hier noch ein paar Fehlermeldungen, auskommentieren zum Testen
;VectorAdd(3, 4)
;VectorAdd(c, c)
;VectorAdd(c, 2)