@include _ext.texi @node Getting Started @chapter Getting Started Welcome to the O programming language! This chapter will introduce you to the basics of the language's syntax. We'll cover variables, data types, operators, control flow, and functions. By the end of this chapter, you'll have a solid foundation in the O language syntax and be ready to start writing your own programs. If you are already familiar with C-like languages, you will find out that @code{O} behave pretty much the same with some small quirks. Let's dive in! @section An olang program An O programming language program starts with a @code{main} function. This function must return the program exit code. @sethl olang @verbatim fn main(): u8 { return 0 } @end verbatim To compile the program you can use @code{olc}. @sethl- bash @verbatim olc my_prog.ol -o my_prog ./my_prog @end verbatim @section Functions Unlike C, O language does not require function prototypes. This means you can call a function before it's defined, making your code more flexible and easier to read in many cases. @sethl olang @verbatim fn main(): u8 { return fib(8) } fn add(a: u32, b: u32): u32 { return a + b } fn fib(n: u32): u32 { if n <= 2 { return n } return add(fib(n - 1), fib(n - 2)) } @end verbatim @section Comments Comments starts with a @code{#}. @sethl- olang @verbatim # Hi I'm a comment and I'll be ignored by the compiler. @end verbatim @section Variables @sethl- olang @verbatim var answer: u32 = 42 @end verbatim @section Flow control Any non zero expr is true. @subsection If-Else @sethl olang @verbatim if expr { # statement } else if expr { # statement } else { # statement } @end verbatim While loop @sethl olang @verbatim while expr { # statement } @end verbatim @subsection While loop @sethl olang @verbatim while expr { # statement } @end verbatim @section Primitive data types @table @samp @item u8 Unsigned 8 bits. @item u16 Unsigned 16 bits. @item u32 Unsigned 32 bits. @item u64 Unsigned 64 bits. @end table @section Binary Operations @subsection Logical @table @samp @item Equals @sethl- olang @verbatim expr1 == expr2 @end verbatim Results zero (false) or one (true). @item Less @sethl- olang @verbatim expr1 < expr2 @end verbatim Results zero (false) or one (true). @item Less Equal @sethl- olang @verbatim expr1 <= expr2 @end verbatim Results zero (false) or one (true). @item Greater @sethl- olang @verbatim expr1 > expr2 @end verbatim Results zero (false) or one (true). @item Greater Equal @sethl- olang @verbatim expr1 >= expr2 @end verbatim Results zero (false) or one (true). @item Or @sethl- olang @verbatim expr1 || expr2 @end verbatim Results zero (false) if both are true or one (true) if any is true. @item And @sethl- olang @verbatim expr1 && expr2 @end verbatim Results zero (false) if any is false or one (true) if both are true. @end table @subsection Bitwise @table @samp @item Shift left @sethl- olang @verbatim n << bits @end verbatim @item Shift left @sethl- olang @verbatim n >> bits @end verbatim @item And @sethl- olang @verbatim n & bits @end verbatim @item Or @sethl- olang @verbatim n | bits @end verbatim @end table @subsection Arithmetic @table @samp @item Addition @sethl- olang @verbatim expr1 + expr2 @end verbatim @item Subtraction @sethl- olang @verbatim expr1 - expr2 @end verbatim @item Multiplication @sethl- olang @verbatim expr1 * expr2 @end verbatim @item Division @sethl- olang @verbatim expr1 / expr2 @end verbatim @item Remaining @sethl- olang @verbatim expr1 % expr2 @end verbatim @end table @section Pointers Dealing with memory address. @subsection Address of (&) Get the address of a variable. @sethl olang @verbatim var my_var: u32 = 0 var my_pointer: u32* = &my_var @end verbatim @subsection Dereferencing (*) Accessing the value of the address a pointer points to. @sethl olang @verbatim var my_var: u32 = 0 # The result of *my_pointer is the value of my_var (0). *my_pointer *my_pointer = 42 @end verbatim The program above sets the @code{my_var}'s to 42.