All list types must implement the following keys:

- From exportable type: name, tags, exports, source
- From value type: data
- length: The length of the list. Reflects
*data*.

Syntactic types:

*list*: This is the basic list type.*range*: This is an interpreted list type, look at the range syntax section for more information.

Regular lists must also implement these keys:

- From stringifiable type: pretty
- type: The type specification of the list. The default is the special value
**any**, indicating any type is appropriate. - If the type is serializable (that is, not
**any**), the list is also serializable. - If in this case, if the length (or its reflections) is not explicitely defined, it is assumed to act like
**expand**from data's x*'s*size*. That is, it will take the offset of the following structure and attempt to collect everything within the space. If it does not fit evenly, it will error. - In this case, it must also accept serializable keys: base, size, end. However,
*size*must reflect*type*and*length*such that*size*=*type*.*size***length*.

Although the basic list itself is not stringifiable on its own (a text context must manage it specifically if it wishes to stringify them), it is able to define pretty printing options for itself, some examples are:

- Same-line opening vs. own-line opening
- Separator options, if there are any
- Newline after certain line length or certain number of elements
- With or without trailing comma
- Whether or not to split a single element over multiple lines (?) (This may be better handled by each element)
- Trailing comma for last element or not
- Same-line ending vs. own-line ending

Represents a predictable list of *number*s or *hexnum*s. It's fine if one side is a *number* and one is a *hexnum*.

*range* is something of a supertype that represents four different types of ranges. If one key set is being used, others should not be allowed. All types implement the following keys:

- start: The start value of the range. This does not imply the smallest value of a range. Required. Reflects
*data*. - left: Aliases of
*start*.

- Prefers
*start*over the other aliases. - May accept
for negative infinity. This makes retrieving the full`*`*data*(including*length*and appropriate stats) cause an error. - end: The end (last) value of the range. This does not imply the largest value of a range. Required. Reflects onto
*data*. - You can use this to define an inclusive range.
- May accept
for positive infinity. This makes retrieving the full`*`*data*cause an error. - end1: The end (last) value of the range + 1 (if increasing range) or - 1 (if decreasing range). Reflects
*end*. - You can use this to define an exclusive range.
- If
*end*is, this must also be`*`, and vise-versa.`*` - Read-only statistics:
- difference: The positive difference between the start and end values. Reflects
*start*and*end*. - difference1: The positive difference between the start and end1 values. Reflects
*start*and*end1*.

- Prefers
*start*over the other aliases. - add, plus: Generates a list from from
*start*to*start*+ this, exclusive. Reflects onto*data*. - end: The end (last) value of the range. Effectively
*start*+*add*- 1. Reflects*data*. - end1: The end (last) value of the range + 1. Effectively
*start*+*add*. Reflects*data*. - Implements the basic range's statistics.

- Prefers
*start*over the other aliases. - sub, subtract, minus: Generates a list from from
*start*to*start*- this, exclusive. Reflects onto*data*. - end: The end (last) value of the range. Effectively
*start*-*sub*+ 1. Reflects*data*. - end1: The end (last) value of the range - 1. Effectively
*start*-*sub*. Reflects*data*. - Implements the basic range's statistics.

*multiplicand*: A dispreferred alias of*left*.- times, multiplier: How many times
*left*is repeated. Reflects onto*data*. - May accept
for infinity times. This makes retrieving the full`*`*data*(including*length*and appropriate stats) cause an error. - It's welcome to implement
*end*,*end1*, and the statistics keys for number formulations, but they have little meaning.

Examples for the different types of ranges:

1~5 = { data: [1, 2, 3, 4, 5], length: 5, start: 1, end: 5, end1: 6, difference: 4, difference1: 5 } 2*3 = { data: [2, 2, 2], length: 3, left: 2, times: 3 } 4+3 = { data: [4, 5, 6], length: 3, start: 4, add: 3, end: 6, end1: 7, difference: 2, difference1: 3 } 4+-3 = { data: [4, 3, 2], length: 3, start: 4, sub: 3, end: 2, end1: 1, difference: 2, difference1: 3 }