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)