Slices

Compile using blc my-file-name.bl and run ./out.

main :: fn () s32 {
	// Declare slice variable, no allocation is done here, my_slice.len is zero
	// and my_slice.ptr is null.
	my_slice: []s32;

	// Use of the 'alloc_slice' function to allocate memory block for 10 numbers.
	alloc_slice(&my_slice, 10);

	// Release memory allocated by 'alloc_slice' when it's no longer needed. Defer
	// statement will execute 'free_slice' function at the end of current 
	// scope.
	defer free_slice(&my_slice);


	// Len is now set to 10.
	print("my_slice.len = %\n", my_slice.len);

	// Ptr is pointer to the allocated memory.
	print("my_slice.ptr = %\n", my_slice.ptr);

	// The 'alloc_slice' will set allocated elements to 0.
	print("my_slice: %\n", my_slice);



	// Fill the slice with numbers
	loop i := 0; i < my_slice.len; i += 1 {
		// Use [N] to access elements.
		my_slice[i] = i;
	}

	print("my_slice: %\n", my_slice);


	// Array can be implicitly converted to slice, in such case no 'alloc_slice'
	// or 'free_slice' is needed. Actual data will stay in original array
	// location, slice in such case acts only like an 'interface' to the original
	// array.

	array := [4]s32.{0, 1, 2, 3};
	slice_from_array : []s32 = array;

	print("slice_from_array = %\n", slice_from_array);

	// This implicit conversion can be useful in function calls. We can now call
	// function 'gimme_slice' with any slice containing numbers of s32 type. If 
	// you try this with regular arrays you will be able to pass only arrays of 
	// the exact same size defined in array type of the function argument. 
	// Passing of array will cause copying of whole array on callee side, passing 
	// slice is much more effective, since it's only len and ptr to data.
	gimme_slice(my_slice);
	gimme_slice(slice_from_array);

	// Due to implicit conversion from array to slice we can call 'gimme_slice'
	// function directly with an array argument, it will be passed into the 
	// function as a slice.
	gimme_slice(array);

	return 0;
}

gimme_slice :: fn (slice: []s32) {
	print("Slice has % elements.\n", slice.len);
}