Function Parameters/Return and Strings
example(int a, b, c) int, int { return a*b+c, a*b-c }
example2(int a, b mut, c out) int { b *= a; c .= 100; return 1 }
main()
{
a, b = example(5, 3, 2)
assert(a == 17)
assert(b == 13)
print("$a $b")
int my_inout = 3
returnValue = example2(2, my_inout mut, my_out out)
print("$my_inout $my_out")
assert(returnValue == 1)
assert(my_inout == 6)
assert(my_out == 100)
}
Output:
17 13
6 100
Error Handling
main() {
value = fn1() error { return }
print(value)
}
fn2(int a) int! {
if (a < 0 || a > 20)
return InvalidParameter
return a*2
}
fn1() int! {
a = fn2(15) error {
print("We shouldn't get an error here")
return 1
}
print("A")
b = try fn2(3)
print("B")
c = fn2(30) error {
print("C")
return error
}
print("End of fn1")
return 3
}
Output:
A
B
C
Array Bounds
GetArray(int size) int[] {
//Next line is an alternative way to write int array[]
array := decl int[]
for i = 0 to size {
array.Push(100+i)
}
return array
}
GetInt(int v) int { return v*3 }
main() {
for v in GetArray(0) {
print(v) //Never executes
}
//on empty/on break/on complete must follow the loop
//like an else if must follow an if
on empty {
print("Empty Array")
}
a = GetArray(10)
//Uncomment either to get an array bounds error
//print(a[0])
//assert(a[0] == 100)
//Several ways to solve this
//One is by using literals
if a.size >= 10
{
//array size is tagged as >= 10
//9 is both >=0 and < 10
assert(a[9] == 109)
}
//Another is a range check
i = GetInt(1)
if i >= 0 && i < a.size {
assert(a[i] == 103)
}
//You can also do an inverted check
if i < 0 {
//i is tagged as a negative value
return
}
//because the if returns the check is
//inverted. i is now tagged as positive
//Now an inverted check on size
if i >= a.size //the = in >= is important
return //return/break/continue doesn't require { }
//i is now tagged as < a.size
//i is in bounds as long as 'i' and 'a' isn't modified
assert(a[i] == 103)
}
Output:
Empty Array