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(decl 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
{
int dummy
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