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.