## 1 - Variables Variables defined using #= can't be changed (they are "final"), while the ones affected using the normal operator (=) can. ``` helloworld #= "Hello World" ``` ## 2 - (Anonymous) Functions You can make an anonymous functions using the following syntax: ``` getHelloWorld: ~String => { return "Hello World!" } ``` `~String` can be omitted, see [#3](#3---types). Note that you can make `getHelloWorld` final by replacing `=>` with `#=>`. To define a **named** (and mandatorily final) function, replace `=>` with `>>` and put the (optional) return type before the function's name: ``` String getHelloWorld >> { return "Hello, World!" } ``` ### 2.1 - Main Main can be a variable named `main` that contains an anonymous function, a function named `main` or a function that has the `as_main` attribute: ``` main #=> {} main >> {} as_main helloWorld >> {} ``` ## 3 - Types Types are *inferred*, which means that specifying types of variables or returned values is optional. Every variable has a static type by default; it is possible to make a **non-final** variable dynamic by adding the `dyn`/`dynamic` attribute: ``` dyn helloWorld = 0 helloWorld = "Hello World!" ``` The attributes mentioned above can also be used as a return type for functions/anonymous functions: ``` helloWorld: ~dynamic => {} dyn helloWorld >> {} ```