From 6e1eeeebfb453fa7c871869c19375ce60fbd7413 Mon Sep 17 00:00:00 2001 From: Kartik Agaram Date: Sat, 27 Jul 2019 16:01:55 -0700 Subject: 5485 - promote SubX to top-level --- archive/2.vm/063array.mu | 181 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 181 insertions(+) create mode 100644 archive/2.vm/063array.mu (limited to 'archive/2.vm/063array.mu') diff --git a/archive/2.vm/063array.mu b/archive/2.vm/063array.mu new file mode 100644 index 00000000..a56e87f0 --- /dev/null +++ b/archive/2.vm/063array.mu @@ -0,0 +1,181 @@ +scenario array-from-args [ + run [ + local-scope + x:&:@:num <- new-array 0, 1, 2 + 10:@:num/raw <- copy *x + ] + memory-should-contain [ + 10 <- 3 # array length + 11 <- 0 + 12 <- 1 + 13 <- 2 + ] +] + +# create an array out of a list of args +def new-array -> result:&:@:_elem [ + local-scope + capacity:num <- copy 0 + { + # while read curr-value + curr-value:_elem, exists?:bool <- next-input + break-unless exists? + capacity <- add capacity, 1 + loop + } + result <- new _elem:type, capacity + rewind-inputs + i:num <- copy 0 + { + # while read curr-value + done?:bool <- greater-or-equal i, capacity + break-if done? + curr-value:_elem, exists?:bool <- next-input + assert exists?, [error in rewinding inputs to new-array] + *result <- put-index *result, i, curr-value + i <- add i, 1 + loop + } + return result +] + +# fill an existing array with a set of numbers +# (contributed by Caleb Couch) +def fill array:&:@:num -> array:&:@:num [ + local-scope + load-inputs + loopn:num <- copy 0 + length:num <- length *array + { + length?:bool <- equal loopn, length + break-if length? + object:num, arg-received?:bool <- next-input + break-unless arg-received? + *array <- put-index *array, loopn, object + loopn <- add loopn, 1 + loop + } +] + +scenario fill-on-an-empty-array [ + local-scope + array:&:@:num <- new number:type, 3 + run [ + array <- fill array, 1 2 3 + 10:@:num/raw <- copy *array + ] + memory-should-contain [ + 10 <- 3 + 11 <- 1 + 12 <- 2 + 13 <- 3 + ] +] + +scenario fill-overwrites-existing-values [ + local-scope + array:&:@:num <- new number:type, 3 + *array <- put-index *array, 0, 4 + run [ + array <- fill array, 1 2 3 + 10:@:num/raw <- copy *array + ] + memory-should-contain [ + 10 <- 3 + 11 <- 1 + 12 <- 2 + 13 <- 3 + ] +] + +scenario fill-exits-gracefully-when-given-no-inputs [ + local-scope + array:&:@:num <- new number:type, 3 + run [ + array <- fill array + 10:@:num/raw <- copy *array + ] + memory-should-contain [ + 10 <- 3 + 11 <- 0 + 12 <- 0 + 13 <- 0 + ] +] + +# swap two elements of an array +# (contributed by Caleb Couch) +def swap array:&:@:num, index1:num, index2:num -> array:&:@:num [ + local-scope + load-inputs + object1:num <- index *array, index1 + object2:num <- index *array, index2 + *array <- put-index *array, index1, object2 + *array <- put-index *array, index2, object1 +] + +scenario swap-works [ + local-scope + array:&:@:num <- new number:type, 4 + array <- fill array, 4 3 2 1 + run [ + array <- swap array, 0, 2 + 10:num/raw <- index *array, 0 + 11:num/raw <- index *array, 2 + ] + memory-should-contain [ + 10 <- 2 + 11 <- 4 + ] +] + +# reverse the elements of an array +# (contributed by Caleb Couch) +def reverse array:&:@:_elem -> array:&:@:_elem [ + local-scope + load-inputs + start:num <- copy 0 + length:num <- length *array + end:num <- subtract length, 1 + { + done?:bool <- greater-or-equal start, end + break-if done? + array <- swap array, start, end + start <- add start, 1 + end <- subtract end, 1 + loop + } +] + +scenario reverse-array-odd-length [ + local-scope + array:&:@:num <- new number:type, 3 + array <- fill array, 3 2 1 + run [ + array <- reverse array + 10:@:num/raw <- copy *array + ] + memory-should-contain [ + 10 <- 3 + 11 <- 1 + 12 <- 2 + 13 <- 3 + ] +] + +scenario reverse-array-even-length [ + local-scope + array:&:@:num <- new number:type, 4 + array <- fill array, 4 3 2 1 + run [ + array <- reverse array + 10:@:num/raw <- copy *array + ] + memory-should-contain [ + 10 <- 4 + 11 <- 1 + 12 <- 2 + 13 <- 3 + 14 <- 4 + ] +] -- cgit 1.4.1-2-gfad0