# FILO

FILO is a stack-based programming language. A FILO program consists of an expression.

## Syntax

program = expression; expression = "@" | "0" | expression, "*", expression | expression, "+", expression | | expression, "-", expression | identifier, "*", identifier, expression, ",", expression, "," | "[", definitions, "]", expression; definitions = definition, { definitions }; definition = identifier, "=", expression;

Identifiers are consecutive sequences of non-whitespace characters, excluding `@`

, `0`

, `*`

, `+`

, `-`

, `,`

, `[`

, `]`

and `=`

. Whitespace separates identifiers and is otherwise ignored.

`*`

, `+`

, and `-`

are right-associative and have equal precedence.

A `,`

at the end of a definition or at the end of a program may be omitted.

Comments begin with `==`

and extend to the end of the line.

## Expressions

### Argument

@

The argument of the function.

### Empty

0

An empty stack.

### Push

x * y

A new stack with `x`

pushed onto `y`

.

### Top

x + y

The top element of `x`

unless `x`

is empty, then `y`

.

### Pop

x - y

The stack consisting of `x`

with its top element removed unless `x`

is empty, then `y`

.

### Apply

f*g x, y,

A new stack with the result of applying function `f`

to top element of `x`

pushed onto
the result of applying function `g`

to `x`

with its top element removed unless `x`

is empty, then `y`

.

### Let

[f=x g=y]z

Defines `f`

and `g`

when evaluating `z`

. This is a recursive let, so `f`

and `g`

are defined for `x`

and `y`

as well.

## Input/Output Encoding

How input and output are encoded is implementation-defined.

One possibility is for the argument and result to be interpreted as stacks of bits, where the each element of the stack is interpreted as 0 if it is empty, and interpreted as 1 if it is not empty, and the argument being constructed from the bits of the input, and the result being interpreted as the bits of the output.

## Examples

These examples use the input/output encoding defined by the implementation below.

### cat

@

### Hello world

[h=0*0*0*@*0*0*@*0 * @*0*@*0*0*@*@*0 * 0*0*@*@*0*@*@*0 * 0*0*@*@*0*@*@*0 *@*@*@*@*0*@*@*0 * 0*0*0*0*0*@*0*0 * @*@*@*0*@*@*@*0 * @*@*@*@*0*@*@*0 *0*@*0*0*@*@*@*0 * 0*0*@*@*0*@*@*0 * 0*0*@*0*0*@*@*0 * @*0*0*0*0*@*0*0 *0*@*0*@*0*0*0*0] h*h 0*0*0,0,-0