Statements

A Luna program is basically a list of statements, called a Chunk.

Chunk

A list of statements with no seperator

Block

Just a list of statements like a Chunk, but it requires { at the start and } at the end.

Statement

A statement has a lot of variants, like let-bindings, function definitions, etc. But it also can as well just be a Block

Let Binding

This is what you define local variables with. The assignees can be simple identifiers or object/vector destructurings.

Examples: let a = 1, let { name, age } = person, let [first, second, third] = numbers

Assign

This is how you assign new values to existing variables. The assignees can be simple identifiers or a field/index into an object/vector

Examples: a = 2

Assign Operation

Written the same way as Assign expect with any of the following assign operators, only one assignee and only one expression:

assign operators
+=
-=
*=
/=
^=
%=

Examples: a += 1, b *= 2

Call

This is to call functions with arguments. The callee can either be a simple identifier or a field/index of an object/vector.

Examples: print("Hello, World!"), self.add(1)

Self Call

Just like a Call only written with a : followed by an identifier. This calls the function with the first argument being the value before the :. This is used to call objects with themselfs for object-oriented design patterns.

Examples: vector:push(1), person:greet()

Function Definition

This is used to globally define functions with parameters.

Examples: fn add(a, b) { return a + b }

Let-Function Definition

This is used to locally define functions with parameters in the current scope.

Examples: let fn add(a, b) { return a + b }

If-Branch

Classical if-branch like any other. Has an optional else-case which can either be a block or another if-branch.

Examples: if cond { print("yay") } else { print("nay") }, if cond { print("yay") } else if cond2 { print("semi-yay") }

While-Loop

Classical while-loop like any other. body has to be a block

Examples: while a < 10 { a += 1 }

For-Loop

Python-like for-loop that requires an iterable to be right of the in keyword. Only one variable can be given for each iteration. An iterable can either be an user-object with a next method, an object with the meta variable __next which is a function, or just a function.

Examples: for n in [1, 2, 3]:iter() { print(n) }, for key in keys(map) { print(key, map[key]) }

Return

This is used to return a value to the caller and end execution of the current function.

Examples: return a + b, return null

Break

This is used to break out of any loop.

Examples: while true { if a >= 10 { break } }

Continue

This is used to continue to the next iteration of the loop.

Examples: for n in numbers:iter() { if n == 5 { continue } print(n) }