diff options
| -rw-r--r-- | DESIGNDOC.md | 145 | ||||
| -rw-r--r-- | SPEC.md | 139 |
2 files changed, 145 insertions, 139 deletions
diff --git a/DESIGNDOC.md b/DESIGNDOC.md new file mode 100644 index 0000000..4cceb84 --- /dev/null +++ b/DESIGNDOC.md @@ -0,0 +1,145 @@ +# Sylt-lang + +The language specification, also known as the "less fun" document. + +For goals and the like, see the README.md. + +## The syntax by example + +We choose to include programs here. They should be valid in Sylt programs if all +goes to plan. + +```sylt +a := 1 +b : int = a +print(b) // 1 +``` + +Here we can see variable declaration, types and calling of simple functions. + +### Definition statement + +```sylt +a := 1 // Define a to be 1. automatically infers int as type. +b : int = 1 // Define b to be 1, explicitly as int +c : int = 0.4 // Invalid: Types don't match + +// The definition of a function that takes +// one argument and returns an integer value. +d := fn a: int -> int { + ret a + 1 +} + +// Constant +a :: 1 +a = 2 // Invalid + +// Destructuring a tuple is allowed. After the definiton we have: +// e = 1, f = 2, g = 3. +// +// The number of variables need to match the length of the tuple. +e, f, g := (1, 2, 3) +h, i := (1, 2, 3) // Invalid + +q := 1 +q := 1 // Invalid: You are not allowed to re-declare variables + +z := 1 +{ + z := z // Valid: The inner z is a different variable +} +``` + +### If-statements + +```sylt +// Basic if-statement +if some_boolean_value { + do_on_true() +} + +// With else-statement +if some_boolean_value { + do_on_true() +} else { + do_on_false() +} + +// If-else-statements +if some_boolean_value { + do_on_true() +} else if some_other_value { + do_on_second_true() +} +``` + +### For-loops + +```sylt +// 'Normal' for-loop +// Prints the numbers 0-9 +for i := 0, i < 10, i++ { + print(i) +} + +// 'Enhanced' for-loop +// Iterates over the collection after 'in'. +// This example prints the numbers 1, 2, 3 and 4 in order. +for i in (1, 2, 3, 4) { + print(i) +} + +// 'Infinite' for-loop +// The loop will run forever, or until +// a piece of control flow causes it to jump +// out of the loop. Here we use 'break'. +for { + print(1) + break; +} + +``` + +### Functions + +All functions are values. + +```sylt +// Declare and create a function +f :: fn { + print "A" +} +// These are semantically equivalent +f() +f! + +// Declare and create a function +f :: fn a: int -> int { + print a + ret a + 1 +} +// These are semantically equivalent +f 1 +f(1) + +// Closures exist +q := 1 +g :: fn -> int { + ret q // Here the variable 'q' is captured +} +q = 2 +print g! // prints 2 + +// Supports higher-order-functions +h :: fn -> fn -> int { + ret fn -> int { ret 2 } +} +print h()() // prints 2 +``` + +### Special syntax + +```sylt +<!> // The unreachable statement. If it is executed the program halts. +1 <=> 1 // Asserts equality. If the assert fails the program halts. +``` diff --git a/SPEC.md b/SPEC.md deleted file mode 100644 index f05ac9c..0000000 --- a/SPEC.md +++ /dev/null @@ -1,139 +0,0 @@ -# Sylt-lang ------------ -The language specification, also known as "the less fun" document. - -For goals and the like, see the README.md file. - -## The syntax by example - -I choose to include programs here, that should be valid -in Sylt programs if all goes to plan. - -```sylt -a := 1 -b : int = a -print(b) // 1 -``` -Here we can see variable declaration, types and -the calling of simple functions. - -### Definition statement -```sylt -a := 1 // Define a to be 1, automatically infers int as type. -b : int = 1 // Define b to be 1, explicitly as int. -c : int = 0.4 // A compilation error, since types don't match. - -// The definition of a function, that takes -// one argument and returns an integer value. -d := fn a: int -> int { - ret a + 1 -} - -// Constant -a :: 1 -a = 2 // This is illegal - -// Destructuring a tuple is allowed, after the definiton -// e = 1, f = 2, g = 3. -// If the number of variables doesn't match the length -// of the tuple, that would raise a compilation error. -e, f, g := (1, 2, 3) - -q := 1 -q := 1 // You are not allowed to re-declare variables - -z := 1 -{ - z := z // This is allowed since this inner z is a differnt variable. -} -``` - -### If-statements -```sylt -// Basic if-statements -if some_boolean_value { - do_on_true() -} - -// With else statement -if some_boolean_value { - do_on_true() -} else { - do_on_false() -} - -// If-else statements -if some_boolean_value { - do_on_true() -} else if some_other_value { - do_on_second_true() -} -``` - -### For-loops -```sylt -// 'Normal' For-loop -// Would print numbers 0-9 -for i := 0, i < 10, i++ { - print(i) -} - -// 'Enhanced' For-loop -// Would print the numbers 1, 2, 3 and 4 -// More precisely, all in the collection -// specified after the 'in' keyword. -for i in (1, 2, 3, 4) { - print(i) -} - -// 'Infinite' For-loop -// The loop would run forever, or until -// a piece of control flow causes it to jump -// out of the loop. Here we use 'break'. -for { - print(1) - break; -} - -``` - -### Functions -All functions are values. -```sylt -// Declare and create the function -f :: fn { - print "A" -} -// Semantically equivalent -f() -f! - -// Declare and create the function -f :: fn a:int -> int { - print a - ret a + 1 -} -// Semantically equivalent -f 1 -f(1) - -// Closures exist -q := 1 -g :: fn -> int { - ret q // Here the variable 'q' is captured -} -q = 2 -print g! // prints 2 - -// Supports heigher order functions -h :: fn -> fn -> int { - ret fn -> int { ret 2 } -} -print h()() // prints 2 -``` - -### Special syntax -```sylt -<!> // The unreachable statement, it should never be executed -1 <=> 1 // Asserts equality, so the program crashes if 1 != 1 -``` |
