Part 3 of Goose, then any language on Flisk. This is the program part 4 will compile into an image. The function is the one from part 2.
shop.goose:
fn total(xs: i64[:]) -> i64 { var t = 0; for x in xs { t += x; } return t; } fn main() { var grow: i64[>..] = []; for i in 5 { grow.push(i * i); } print(grow); print(total(grow)); print(total(grow[1..4])); } goose shop.goose for i in 5 is 0, 1, 2, 3, 4. push appends. i64[>..] is grow-only: references into it stay valid across push. That is the array you want until you have a reason to pick another spelling.
grow[1..4] is a slice, exclusive at the end. total accepts the whole array and the slice, because both become i64[:]. grow[^2..] is the last two elements. ^k means len - k.
What not to copy by accident
var a: i64[>..] =;[1][2][3] var b = a; // b names the same array var c = copy(a); // this one is a copy Fixed-size values copy on assignment. A growable array does not. f(grow) also does not copy the elements.
let versus var still applies inside total. t is var because t += x reassigns it.
Build it before Flisk sees it
goose build -o ./shop shop.goose ./shop The process prints and exits. That is a correct Goose program. It is not yet a Flisk service. Part 4 wraps a long-running process around this function, because BYO runs any language whose container stays up and answers /health. The function does not change.