Working With Arrays

RETRO offers a number of words for operating on statically sized arrays.

Namespace

The words operating on arrays are kept in an a: namespace.

Creating Arrays

The easiest way to create an array is to wrap the values in a { and } pair:

```
{ #1 #2 #3 #4 }
{ 'this 'is 'an 'array 'of 'strings }
{ 'this 'is 'a 'mixed 'array #1 #2 #3 }
```


You can also make an array from a quotation which returns values and the number of values to store in the a:

```
[ #1 #2 #3  #3 ] a:counted-results
[ #1 #2 #3  #3 ] a:make
```


Accessing Elements

You can access a specific value with a:th and fetch or store:

```
{ #1 #2 #3 #4 } #3 a:th fetch
```


Find The Length

Use a:length to find the size of the array.

```
{ #1 #2 #3 #4 } a:length
```


Duplicate

Use a:dup to make a copy of an a:

```
{ #1 #2 #3 #4 } a:dup
```


Filtering

RETRO provides a:filter which extracts matching values from an array. This is used like:

```
{ #1 #2 #3 #4 #5 #6 #7 #8 } [ n:even? ] a:filter
```


The quote will be passed each value in the array and should return TRUE or FALSE. Values that lead to TRUE will be collected into a new array.

Mapping

a:map applies a quotation to each item in an array and constructs a new array from the returned values.

Example:

```
{ #1 #2 #3 } [ #10 * ] a:map
```


Reduce

a:reduce takes an array, a starting value, and a quote. It executes the quote once for each item in the array, passing the item and the value to the quote. The quote should consume both and return a new value.

```
{ #1 #2 #3 } #0 [ + ] a:reduce
```


Search

RETRO provides a:contains? and a:contains-string? to search an array for a value (either a number or string) and return either TRUE or FALSE.

```
#100  { #1 #2 #3 } a:contains?
'test { 'abc 'def 'test 'ghi } a:contains-string?
```


Implementation

In memory, an array is a count followed by the values. As an example, if you have an array:

{ #10 #20 #30 }

In memory this would be setup as:

| Offset | Value | | ------ | ----- | | 000    | 3     | | 001    | 10    | | 002    | 20    | | 003    | 30    |

You can construct one on the fly by keeping a pointer to here and using , to place the values. E.g.,

here [ #3 , #10 , #20 , #30 , ] dip

An example of this can be seen in this excerpt from an example (example/Primes.forth):

:create-set (-a)      here #3000 , #2 #3002 [ dup , n:inc ] times drop ;