# Jug

Jug is an esoteric programming language created by User:Marz. Inspired by Liquid and the Die Hard Water Puzzle, Jug involves pouring water between different jugs in order to accomplish integer arithmetic.

## Language overview

Jug has 8 functions, which are called like so:

```function(a,b);
```

Each function returns a value, meaning a function can be called with another function as a parameter.

Strings can be concatenated with ampersands, and can include numbers, like so:

```99&" bottles of beer on the wall."
```

Strings cannot be stored in jugs, as they are not liquid.

## Commands

Function Description
`jug(x,y);` Creates Jug `x` (int), of size `y` (int). Returns `x`.
`fill(x);` Fills Jug `x` (int). Returns `x`.
`empty(x);` Empties Jug `x` (int). Returns `x`.
`pour(x,y);` Pours water from Jug `x` (int) into Jug `y` (int), stopping before Jug `y` overflows. Returns the volume of water poured (int).
`echo(x);` Prints `x` (string). Returns `x`.
`volume(x);` Returns the volume of water in Jug `x` (int).
Flow control
`if_empty(x){};` If Jug `x` is empty, {...}. Returns `x`.
`else{};` Follows `if_empty(x)` statement. If Jug `x` is not empty, {...}. Returns `x`.
`drain(x){};` Loops until Jug `x` (int) is empty. Returns `x`.

## Arithmetic

4+3

```jug(0,4);
jug(1,3);
jug(2,100);
fill(0);
fill(1);
pour(0,2);
pour(1,2);
echo(volume(2));
```

### Subtraction

7-2

```jug(0,7);
jug(1,2);
fill(0);
pour(0,1);
echo(volume(0));
```

### Multiplication

4*6

```jug(0,4);
jug(1,6);
jug(2,1);
jug(3,100);
fill(0);
drain(0){
fill(1);
pour(1,3);
pour(0,2);
empty(2);
}
echo(volume(3));
```

## Examples

### Hello, World!

```echo("Hello, world!");
```

### Fibonacci sequence

```jug(0,20);
jug(1,1);
jug(2,5000);
jug(3,5000);
jug(4,5000);
fill(1);
pour(1,3);
empty(1);
echo("0\n1\n");
drain(fill(0)){
pour(2,empty(4));
pour(3,4);
echo(volume(4)&"\n");
pour(3,empty(2));
pour(4,empty(3));
pour(0,1);
empty(1);
}
```

### 99 bottles of beer

```jug(0,99);
jug(1,1);
drain(0){
echo(volume(0)&" bottles of beer on the wall,\n";
echo(volume(0)&" bottles of beer.\nTake one down, pass it around,\n");
pour(0,1);
empty(1);
if_empty(0) echo("No bottles of beer on the wall.");
else echo(volume(0)&" bottles of beer on the wall.");
}
```