Uniqueness Types¶
Felix has a special type combinator uniq which is used to specify the value of its argument type is exclusively owned. It is usually applied to pointers.
First lets write a procedure to convert a varray of chars to upper case:
proc toupper(x: varray[char]) {
for i in 0 ..< x.len.int
perform set(x,i,toupper(get(x,i)));
}
Varray’s are passed by reference, so this modifies the varray in place. So how would we use this in a function?
fun upcase(x: varray[char]) {
var y = varray x; // copy
toupper y;
return y;
}
We can’t just call toupper on the parameter x and return it because in Felix functions are not allowed to have side effects.
But consider this case:
var upped = upcase$ varray("Hello World");
println$ upped.str;
This is inefficient because in upcase we copy the array, modify the copy and return it, but the argument x is then no longer reachable, so it will be garbage collected.
Why not just modify the argument directly in this case:
fun upcase(x: uniq varray[char]) {
toupper x,peek;
return x;
}
var upped = upcase$ box (varray("Hello World"));
println$ upped.str;