SigmaF

Learn SigmaF

Before starting, it is necessary to know this:

printLn("Hello, World!")

Comments

If you want to comment your code, you can use:

-- This is a single line comment
/*
And this a multiline comment
*/

Data Types

Let Statements

This language does not use variables. Instead of variables, you can only declare static values.
For declaring a value, you must use let and give it a value. For example:

let a = 1 -- Interger
let b = 1.0 -- Float
let c = "string" -- String
let d = true -- Boolean
let e = [1,2,3] -- List
let f = (1, 2) -- Tuple
...

SigmaF allows data type as Integer, Float, Boolean, and String.

Data Structs

Lists

The Lists allow to use all the data types before mentioned, as well as lists and functions.
Also, they allow to get an item through the next notation:

let value_list = [1,2,3,4,5,6,7,8,9]
value_list[0] -- Output: 1
value_list[0, [4] -- Output: [1,2,3,4]
value_list[0, 8, 2] -- Output: [1, 3, 5, 7]

The struct of List CAll is example_list[<Start>, <End>, <Jump>]

Tuples

The tuples are data structs of length greater than 1. Unlike lists, they allow the following operations:

(1,2) + (3,4) -- Output: (4,6)
(4,6,8) - (3,4,5) -- Output: (1,2,3)
(0,1) == (0,1) -- Output: true
(0,1) != (1,3) -- Output: true

To obtain the values of a tuple, you must use the same notation of the list. But this data structure does not allow ranges like the lists (only you can get one position of a tuple).

E.g.

let t = (1,2,3,4,5,6)
t[1] -- Output: 2
t[5] -- Output: 6

And so on.

Conditionals

Regarding the conditionals, the syntax structure is:

if <Condition> then {
<Consequence>
}
else{
<Other Consequence>
}

For example:

if x <= 1 || x % i == 0 then {
false;
}
if x == i then {
true;
}
else {
false;
}

Functions

For declaring a function, you have to use the next syntax:

let example_function = fn <Name Argument>::<Argument Type> -> <Output Type> {
=> <Return Value>
}

(For return, you have to use the => symbol)

For example:

let is_prime_number = fn x::int, i::int -> bool {
if x <= 1 then {=>false;}
if x == i then {=> true;}
if (x % i) == 0 then {=> false;}
=> is_prime_number(x, i+1);
}

printLn(is_prime_number(11, 2)) -- Output: true

Operators

Warning: SigmaF have Static Typing, so it does not allow the operation between different data types.

These are operators:

Operator Symbol
Plus +
Minus -
Multiplication *
Division /
Modulus %
Exponential **
Equal ==
Not Equal !=
Less than <
Greater than >
Less or equal than <=
Greater or equal than >=
And &&
Or ||

The operator of negation for Boolean was not included. You can use the not() function in order to do this.

Some Examples

Quick Sort

-- Quick Sort
let qsort = fn l::list -> list {

if (l == []) then {=> [];}
else {
let p = l[0];
let xs = tail(l);

let c_lesser = fn q::int -> bool {=> (q < p)}


let c_greater = fn q::int -> bool {=> (q >= p)}

=> qsort(filter(c_lesser, xs)) + [p] + qsort(filter(c_greater, xs));
}
}

Filter

-- Filter
let filter = fn c::function, l::list -> list {
if (l == []) then {=> [];}

=> if (c(l[0])) then {[l[0]]} else {[]} + filter(c, tail(l));
}

Map

-- Map
let map = fn f::function, l::list -> list {
if (l==[]) then {=> [];}

=> [f(l[0])] + map(f, tail(l));
}