FILO

From Esolang
Jump to navigation Jump to search

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

References