nessa-language 0.9.1

An extensible programming language with a strong type system
Documentation
Many programming languages allow the user to add extra information to the structures they define by using **annotations**. 
You can also use them in Nessa. Let's see how.

## Syntax


An annotation in Nessa consists on a **name**, some **positional arguments** and some **named arguments**. Depending on the 
particular annotation, some arguments might be needed or optional. Also, you can use multiple annotations on a single definition. 
Here is the syntax:

```
// These two are equivalent

@annotation_name
fn function_name() {
    // ...
}

@annotation_name()
fn function_name() {
    // ...
}

// This one has positional arguments

@annotation_name("argument 0", "argument 1")
fn function_name() {
    // ...
}

// This one has named arguments

@annotation_name(
    name_0: "argument 0", 
    name_1: "argument 1"
)
fn function_name() {
    // ...
}

// This one has both

@annotation_name(
    "Positional arg 0",
    name_0: "argument 0", 
    name_1: "argument 1",
    "Positional arg 1" // You can insert named arguments between positional ones 
)
fn function_name() {
    // ...
}
```

## Usage


An annotation in Nessa can be put just before any **class**, **syntax**, **function**, **operation** or **interface** definition. Also, you can
annotate any **function** or **operation** inside an interface definition. In later sections we will take a look at every 
available annotations defined in the interpreter.