uiua 0.1.0

A stack-based array programming language
Documentation

<img src="site/uiua-logo.png" width="140"/> 

# Uiua


Uiua (pronounced *"wee-wuh"*) is a stack-based array programming language.

Documentation, examples, and an online interpreter can be found at [uiua.org](https://uiua.org).

You can also check out the [Discord server](https://discord.gg/3r9nrfYhCc).

You can support Uiua's development via [GitHub Sponsors](https://github.com/sponsors/uiua-lang).

## Installation


You can try the language without installing anything on [the website](https://uiua.org).

If you want to install the interpreter locally there are 2 options:
- If you are on Windows, you can simply download the [latest release]https://github.com/uiua-lang/uiua/releases.
- If you are not on Windows, you will need to install via Cargo.
This requires [Rust]https://www.rust-lang.org/tools/install to be installed.

  You can install with:
  ```
  cargo install uiua
  ```
  The following optional features are available (enabled by passing `--features <feature>`):
  - `bytes`: Enables byte arrays, which behave identically to numeric arrays but take up less space.
    - Byte arrays are returned by certain IO system functions.
  - `audio`: Enables audio system functions

  If you want audio on Linux, you may need to install some dependencies first:
  ```
  apt install libasound2-dev libudev-dev pkg-config
  ```
- If you want the most recent development version of Uiua, you can install from the git repository.
  ```
  cargo install --git https://github.com/uiua-lang/uiua uiua
  ```

## Language Server


The interpreter has a built-in language server that implements the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/).

A language client extension is available for VSCode [here](https://marketplace.visualstudio.com/items?itemName=uiua-lang.uiua-vscode).

The language client requires that the interpreter is installed locally and available on your PATH.

## Formatter Configuration


You can configure Uiua's formatter by creating a file called `.fmt.ua` in the directory from which you run the interpreter. This configuration file is also a Uiua program.

Configuration options are specified by binding values to specific names.

Example with default values:
```
TrailingNewline ← 1
CommentSpaceAfterHash ← 1
MultilineIndent ← 2
CompactMultilineMode ← "auto"
AlignComments ← 1
IndentItemImports ← 1
```

The following configuration options are available:

### `TrailingNewline`

Type: boolean

Default: `1`

Whether to add a trailing newline to a file.

### `CommentSpaceAfterHash`

Type: boolean

Default: `1`

Whether to insert a space after a `#` in a comment if there is not one already.

### `MultilineIndent`

Type: natural number

Default: `2`

The number of spaces to indent each line of a multiline expression.

### `CompactMultilineMode`

Type: one of `"always"`, `"never"`, or `"auto"`

Default: `"auto"`

How to format multiline expressions.
- `"always"`: Always format multiline expressions in compact mode.
- `"never"`: Never format multiline expressions in compact mode.
- `"auto"`: Format multiline expressions in compact mode if they exceed `MultilineCompactThreshold`.

### `MultilineCompactThreshold`

Type: natural number

Default: `10`

The maximum a columns a multiline expression can start on before it stops being formatted in compact mode.

Only used if `CompactMultilineMode` is `"auto"`.

### `AlignComments`

Type: boolean

Default: `1`

Whether to align consecutive end-of-line comments.

### `IndentItemImports`

Type: boolean

Default: `1`

Whether to indent item imports.
Respects `MultilineIndent`.