Home / Highlights / FAQ / Examples / Quick Start / Download Forum / Register / Login

NOTICE: We didn't get around to implementing structs and classes as an array. Previously it had been implemented as a template but templates bloated fast so we switched to generics. We almost reimplemented it with generics but we weren't happy with generic preformance so that got cut for now. A struct and class without initializers or constructor should work with a fixed length array but it hasn't been tested as much as the other features

struct ABC {
	int a = 5, b = 8, c //uninitialized variables default to 0
}
main() {
	ABC a
	assert(a.a == 5 && a.b == 8 && a.c == 0)
	assert(Is456($ABC{4, 5, 6})) //Must initialize all variables
	//TODO allow _ to mean default value
	assert(!Is456(a))
	main2()
}

Is456(ABC abc) bool { return abc.a == 4 && abc.b == 5 && abc.c == 6 }

////////////////

class RAIIClass
{
	constructor() { print("RAIIClass Constructing") }
	destructor()  { print("RAIIClass Destructing") }
}
class Test
{
	int+ a, b //+ means we want positive values that can fit into a signed int
	RAIIClass member //member constructor/destructor fully works
	constructor() { print("Constructing") }
	destructor()  { print("Destructing $a, $b") }

	//Property
	int Alpha get { return a } set
	{ 
		//'a' must be positive, we'll get an error if we don't ensure it
		if value >= 0
			a .= value
		else
			a .= 0
	}
	int Beta  get { return b*b } //no setter

	//We're not an array but lets implement this
	operator[](s64 index) int const {
		//TODO switch
		if index == 0
			return a
		else if index == 1
			return b
		else
			return 0
	}
	//This is the setter
	operator[](int index, int+ value) int {

		if index == 0
			return a .= value + 10
		else if index == 1
			return b .= value + 20
		else
			return 0
	}
}

AlphaBeta(Test t) int { return t.Alpha + t.Beta }

main2()
{
	Test t
	t.Alpha .=  1; assert(t.Alpha == 1)
	t.Alpha .= -5; assert(t.Alpha == 0)
	assert(t.Beta == 0)
	t[0] .= 1 //indexer added 10 on set
	t[1] .= 2 //indexer added 20 on set
	t[2] .= 5
	assert(t[0] == 11)
	assert(t[1] == 22)
	assert(t[3] == 0)
	assert(t.Alpha == 11)
	assert(t.Beta == 484)
	assert(AlphaBeta(t) == 495)
	//Because of extend (below) we can do this
	assert(t.AlphaBeta() == 495)
}

extend AlphaBeta