Syntax
Easel code is written in files with the filename extension .easel
.
An Easel file consists of a series of declarations, most commonly function declarations. Other kinds of declarations include constants, properties, buffs and accumulators. Declarations often contain a block of statements.
Example of a simple Easel file:
pub const MaximumThreshold = 321 // static constant declaration
// Declare a function named MyFunction1, with its parameters and statements
pub fn MyFunction1(x) {
let y = 123 // declare a variable named 'y', assign its initial value of 123
DoSomething1 // call function DoSomething1 without arguments
if x < MaximumThreshold { // if statement
DoSomethingElse(x, y) // call function DoSomethingElse with arguments
}
}
Statements
A statement block consists one statement per line, enclosed with braces ({
and }
).
A statement is a single instruction to the computer.
If a statement ends with punctuation that leaves it unfinished at the end of a line, it will continue on the next line.
A semicolon (;
) can be used to separate multiple statements on the same line.
Unlike other programming languages, Easel statements do not and should not end with a semicolon.
pub fn MyFunction1() {
CallAFunction("This is a statement")
CallAnotherFunction("This is another statement")
CallFunction3(
"This statement continues onto multiple lines" +
"because the brackets have not been closed yet" +
"and the lines end with a + operators which need a right hand side value"
)
CallAFunction("This line has statements"); CallAFunction("separated by a semicolon")
}
The most common form of statement is a function call, but there are other kinds of statements such as variable declarations, control flow statements, and behaviors.
Expressions
Commonly, statements include expressions.
An expression is a combination of values, variables, operators and functions that can be evaluated to a one or more value.
For example, 1 + 2
is an expression that evaluates to 3
.
Expressions are evaluated according to operator precedence and associativity, so 1 + 2 * 3
equals 7
.
Parentheses can be used to override the default precedence and associativity, so (1 + 2) * 3
equals 9
.
Whitespace
Whitespace (tabs and spaces) is insignificant, so you can and should use them to make your code more readable, for example by indenting code inside a block.
Comments
Comments can be written anywhere in a file and are demarked by either //
at the beginning of their line,
or between a pair of /*
and */
markers.
// This is a single-line comment
/*
this is a multiple line comment
*/
Documentation comments are written using ///
and are used to automatically generate reference documentation for your code.
/// This is a documentation comment which describes what MyFunction does
fn MyFunction() { }
Identifiers
An identifier is a name given to a variable, function, or other item in your code.
Identifiers consist of one or more alphanumeric characters and the underscore (_
) character.
Whether an identifier can begin with a lowercase or uppercase letter depends on its purpose.
For example, local variables must begin with a lowercase letter,
whereas function names must begin with an uppercase letter.
Identifiers can also contain colon (:
) characters, as long as they are not the first or last letter.
The colon must immediately be followed by a letter.
This can be used to group related identifiers together,
somewhat like the concept of a namespace in other progrmaming languages,
but it has no special meaning to the compiler.
pub const MyConstant = 456 // global identifiers must begin with an uppercase letter
pub fn Movement:MoveFast() { // colons are allowed in identifiers to help with namespacing
let myVariable = 123 // local identifier must begin with a lowercase letter
}