# Program Structure

An executable `.melo`

file contains 0 or more definitions (these can be of functions, structures, and `type`

aliases) and, optionally, three dashes (`---`

) followed by a *single* expression.

Here’s an example file `fibonacci.melo`

. It defines a `fibonacci`

function and calls it on `15`

```
# returns the nth fibonacci number, starting from 0
def fibonacci<$n>(n: {$n}) =
let i = 0 :: Nat in
let j = 1 :: Nat in
let tmp = 0 :: Nat in
loop $n do
tmp <- j;
j <- i + j;
i <- tmp;
return i
---
fibonacci(15)
```

When you start a REPL instance with `fibonacci.melo`

, the expression `fibonacci(15)`

is immediately evaluated:

```
$ melorun -i fibonacci.melo
- : Nat
610 (truthy)
melorun>
```

The three dashes are needed to end the definitions section because whitespace is insignificant in Melodeon, *and* Melodeon doesn’t have delimiters. While this makes Melodeon syntax both elegant and flexible, it also means that the compiler cannot tell where the last function definition ends and the standalone expression begins without some help from us.

**Comments** start with a single `#`

. For an example, see the first line of `fibonacci.melo`

above.