# Mixfix#

Mixfix functions allow arbitrary infix operations based on "substitution
holes" by using the `…`

symbol in definitions. The symbols and terms
always need to be delimited by a space character, otherwise they get
interpreted as a prefix.

Example:

```
…+… add
# the "holes" get applied in normal order
:test ((+4) + (+3)) (add (+4) (+3))
```

You can define as many holes as you like. Make sure to place parenthesis for applications inside substitution holes.

```
{…<$>…|… [[[2 - 1 + 0]]]
# evaluated as (5 - 2) + 1 = 4
:test ({ (+5) <$> (+2) | (+1)) ((+4))
:test ({ ((+3) + (+2)) <$> (+2) | (+1)) ((+4))
```

You can use them as normal functions by writing the identifier literally:

```
:test (…+… (+4) (+3)) (add (+4) (+3))
```

## Associativity#

If you write several mixfix operations without parenthesis, they will be
reduced in left-associative order. Just make sure that the longer mixfix
chain is not actually overwritten by *another* mixfix chain.

```
:test ((+8) + (-4) ⋅ (-2)) ((-8))
…+…⋅… [[[2 + (1 ⋅ 0)]]]
:test ((+8) + (-4) ⋅ (-2)) ((+16))
```

## Allowed characters#

Mixfix functions can use any characters of `!?*@:;+-_#$%^&<>/\|{}~=`

as
well as mathematical unicode operators and arrows. Each part must be at
least 1 character long.