127 lines
4.9 KiB
Plaintext
127 lines
4.9 KiB
Plaintext
module test {
|
|
void show(Object o=Null) {
|
|
@Inject Console console;
|
|
console.print(o);
|
|
}
|
|
|
|
void run() {
|
|
// an array literal has Constant mutability; it is **not** mutable
|
|
immutable Int[] literalArray = [1,2,3];
|
|
show($"{literalArray=}, {&literalArray.actualType=}");
|
|
|
|
// obtaining the size or any element of an array is easy
|
|
show($"{literalArray.size=}, {literalArray[2]=}");
|
|
|
|
// modifications to a Constant array result in a new Constant array;
|
|
// in Computer Science, this is called a persistent data structure
|
|
immutable Int[] biggerArray = literalArray + 4;
|
|
show($"{biggerArray=}, {&biggerArray.actualType=}");
|
|
|
|
immutable Int[] biggestArray = biggerArray + biggerArray;
|
|
show($"{biggestArray=}, {&biggestArray.actualType=}");
|
|
|
|
// arrays can be accessed using the bracket operators
|
|
show($"element at {biggestArray[2]=}");
|
|
|
|
// attempts to modify an immutable array "in place" will result in an
|
|
// exception at runtime
|
|
try {
|
|
biggestArray[2] = 99;
|
|
} catch (ReadOnly e) {
|
|
show($"immutable array not modified: {biggestArray=}");
|
|
}
|
|
|
|
// fixed-size arrays are like C/Java/C# arrays; their elements are
|
|
// all set to the default value of the array Element type
|
|
Int[] fixedLengthArray = new Int[10];
|
|
show($"element at {fixedLengthArray[2]=}");
|
|
|
|
// you can also initialize all the elements to a specific value
|
|
Int[] negOnes = new Int[3](-1);
|
|
show($"{negOnes=}");
|
|
|
|
// ... or using a lambda
|
|
Int[] counting = new Int[5](i -> i);
|
|
show($"{counting=}");
|
|
|
|
// attempts to modify a fixed-size array "in place" will succeed
|
|
counting[1] = 99;
|
|
show($"replaced [1]=99: {counting=}");
|
|
|
|
// attempts to add or delete elements from a fixed-size array will
|
|
// raise an exception
|
|
try {
|
|
counting += 101;
|
|
} catch (ReadOnly e) {
|
|
show($"Fixed mutability array not appendable: {counting=}");
|
|
}
|
|
|
|
// you can ask an array for its mutability
|
|
show($"{literalArray.mutability=}, {fixedLengthArray.mutability=}");
|
|
|
|
// you can convert an array from one mutability to another; the
|
|
// Persistent mutability is just like the Constant mutability,
|
|
// except that the array doesn't have to be immutable, so the
|
|
// array can hold elements that are mutable, but no elements can
|
|
// be added, removed, or replaced
|
|
Int[] constantToMutable = biggestArray.toArray(Mutable);
|
|
show($|{constantToMutable=}, {&constantToMutable.actualType=},\
|
|
| {constantToMutable.mutability=}
|
|
);
|
|
Int[] constantToFixed = biggestArray.toArray(Fixed);
|
|
show($|{constantToFixed=}, {&constantToFixed.actualType=},\
|
|
| {constantToFixed.mutability=}
|
|
);
|
|
Int[] fixedToPersistent = counting.toArray(Persistent);
|
|
show($|{fixedToPersistent=}, {&fixedToPersistent.actualType=},\
|
|
| {fixedToPersistent.mutability=}
|
|
);
|
|
Int[] fixedToConstant = counting.toArray(Constant);
|
|
show($|{fixedToConstant=}, {&fixedToConstant.actualType=},\
|
|
| {fixedToConstant.mutability=}
|
|
);
|
|
|
|
// a slice of an array is an array; this is very handy
|
|
Int[] slice = constantToMutable[1..2];
|
|
show($"{slice=}");
|
|
|
|
// slices may rely on the array that they are sliced from; to ensure that
|
|
// changes to the original array don't appear in the slice, the slice
|
|
// must be reified
|
|
constantToMutable[1] = 17; // this will appear in the slice
|
|
slice = slice.reify();
|
|
constantToMutable[2] = 18; // this will NOT appear in the slice
|
|
show($"{constantToMutable=}, {slice=}");
|
|
|
|
// slices can be inclusive or exclusive
|
|
show($"{constantToMutable[1..2]=}");
|
|
show($"{constantToMutable[1..<2]=}");
|
|
show($"{constantToMutable[1>..2]=}");
|
|
show($"{constantToMutable[1>..<2]=}");
|
|
|
|
// creating a new Mutable array uses the simplest form of the constructor;
|
|
// a Mutable array
|
|
Int[] variableArray = new Int[];
|
|
show($"new {variableArray=}");
|
|
|
|
// you can specify an estimated capacity for a new Mutable array, but the
|
|
// capacity is just an optimization hint!
|
|
Int[] willBeGiantArray = new Int[](999);
|
|
show($"new {willBeGiantArray=}, {willBeGiantArray.capacity=}");
|
|
|
|
// you can easily add and remove data from a Mutable array
|
|
for (Int i : 10..1) {
|
|
variableArray.add(i);
|
|
}
|
|
show($"NASA count-down: {variableArray=}");
|
|
|
|
// remove unlucky numbers in Japanese
|
|
variableArray.remove(4);
|
|
show($"lucky count-down: {variableArray=}");
|
|
|
|
// delete by index works as well
|
|
variableArray.delete(variableArray.size-1);
|
|
show($"aborted count-down: {variableArray=}");
|
|
}
|
|
}
|