Skip to content
Bill Hails edited this page Apr 7, 2024 · 15 revisions

Lists are immutable. All the list operators make and return copies if necessary.

A list is written between [ and ] with commas as separators. For example:

[5 + 5, 12]; // [10, 12]

The empty list is written [] and pronounced "null".

There are a few list operators, namely:

@ (pair)

Creates a new list by prepending its lhs to its rhs (which must be a list of the same type):

12 @ [13, 14];

is [12, 13, 14], but

true @ [13, 14]

is a type error: bool != int. See Typedef for ways to create lists of mixed type.

@@ (append)

Creates a new list by making a copy of the lhs with the rhs appended:

[12, 13] @@ [14, 15]; // [12, 13, 14, 15]

@ and @@ are both right-associative.

prefix < (head)

Returns the first element of the list:

<[1, 2, 3]; // 1

prefix > (tail)

Returns all but the first element of the list:

>[1, 2, 3]; // [2, 3]

It is a run-time error to take the head or tail of an empty list.

Given that lists are typed, these "head" and "tail" operations are much less useful than they would be in a lisp where because they combine (<>> is "caddr" for example) they would be useful indeed. I may remove them later to re-use them elsewhere, maybe for binary tree walking.

Next: Strings and Chars

Clone this wiki locally