diff options
Diffstat (limited to '062array.mu')
-rw-r--r-- | 062array.mu | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/062array.mu b/062array.mu new file mode 100644 index 00000000..95af1412 --- /dev/null +++ b/062array.mu @@ -0,0 +1,40 @@ +scenario array-from-args [ + run [ + 1:address:array:location <- init-array 0:literal, 1:literal, 2:literal + 2:array:location <- copy 1:address:array:location/deref + ] + memory-should-contain [ + 2 <- 3 # array length + 3 <- 0 + 4 <- 1 + 5 <- 2 + ] +] + +# create an array out of a list of scalar args +recipe init-array [ + default-space:address:array:location <- new location:type, 30:literal + capacity:integer <- copy 0:literal + { + # while read curr-value + curr-value:location, exists?:boolean <- next-ingredient + break-unless exists?:boolean + capacity:integer <- add capacity:integer, 1:literal + loop + } + result:address:array:location <- new location:type, capacity:integer + rewind-ingredients + i:integer <- copy 0:literal + { + # while read curr-value + done?:boolean <- greater-or-equal i:integer, capacity:integer + break-if done?:boolean + curr-value:location, exists?:boolean <- next-ingredient + assert exists?:boolean, [error in rewinding ingredients to init-array] + tmp:address:location <- index-address result:address:array:location/deref, i:integer + tmp:address:location/deref <- copy curr-value:location + i:integer <- add i:integer, 1:literal + loop + } + reply result:address:array:location +] |