Arrays in Limbo are dynamic and indexed by 0. They can be initialized providing a size, or declared and initialized in two separate statements if no size is specified.
Disclaimer: I don't like this example very much, but I'm not sure how to shore it up. The lesson here is to use lists.
This shows the initialization of an array of integers using a variable, width
, as the count of elements for the array.
Note that on arrays.b:13,15
the array of integers, nums
, and the integer, width
, are declared.
Limbo supports indexing strings. The length, as per len
, of a string is equivalent to the number of utf-8 runes within a given string. All strings in Limbo are utf-8 strings.
This section demonstrates the copying of a string into an array of bytes.
Since the size of arrays is dynamic, one can declare an array to the size of a dynamic value. The array of bytes, dbl
, is initialized to double the size of the array arr
.
Each index of arr
is copied to two neighboring indices in dbl
.
Arrays can be initialized to a given set of values as well. In this case, the characters [a-f]
are used as values to populate the array of strings, chars
. The size of the array will be equal to the number of elements provided in the aforementioned set.
Arrays can be declared to be arrays of other arrays. In this case, the array nest
is an array of four arrays of strings of size 2 << i
.
Arrays can be conditionally initialized to values. The syntax is similar to the case
statement syntax. In this case, the first three indices are initialized to the byte value of 4. Indices three and greater are initialized to the byte value of 0.
Note: Multiple conditional sections are not necessary to initialize to a given value.
This shows the declaration of an array of size 4 containing lists of string pairs. The lists begin as empty lists, comparable to nil.
The lists at indices 0 and 2 are prepended with pairs of strings. The head of the respective lists are then printed by extracting the pairs of strings prepended previously.
; limbo arrays.b
; arrays
Len nums: 0
Len nums: 6
[ 0 2 4 6 8 10]
Len arr: 12
[ b a b y d u c k s ! !]
Len dbl: 24
[ b b a a b b y y d d u u c c k k s s ! ! ! !]
Len chars: 6
[ a b c d e f]
Len nest: 0
Len nest: 4
Lens: [ 2 4 8 16]
Len buf: 10
[ 4 4 4 3 3 3 3 3 3 3]
Len two: 4
Lens: [ 1 0 1 0]
[ (ducks quack) (nil, nil) (inferno os) (nil, nil)]
;
- Play with the widths of different arrays, what happens?
- What can you initialize to with the
* =>
operator, what can't you? - Remove a case section from the
* =>
operator section, are all indices set to that value?