From cb5b87488a15f2ae64b9cda8060c03a008031775 Mon Sep 17 00:00:00 2001 From: Araozu Date: Sun, 1 Oct 2023 20:41:38 -0500 Subject: [PATCH] Improve landing page --- md/learn/adts/union-types.md | 51 +++++++++ md/learn/basics/comments.md | 76 +++----------- md/learn/basics/datatypes.md | 140 +++++-------------------- md/learn/basics/hello-world.md | 55 +--------- md/learn/basics/io.md | 64 ----------- md/learn/basics/the-compiler.md | 72 ------------- md/learn/basics/variables.md | 135 +++++------------------- md/learn/classes/definition.md | 94 +++++++++++++++++ md/learn/classes/static.md | 48 +++++++++ md/learn/collections/arrays.md | 35 +++++++ md/learn/collections/maps.md | 43 ++++++++ md/learn/collections/sets.md | 11 ++ md/learn/collections/tuples.md | 22 ++++ md/learn/flow-control/conditionals.md | 54 ++++++++++ md/learn/flow-control/foreach.md | 0 md/learn/flow-control/if-expresions.md | 0 md/learn/flow-control/loops.md | 82 +++++++++++++++ md/learn/flow-control/match.md | 56 ++++++++++ md/learn/flow-control/while.md | 0 md/learn/functions/declaration.md | 70 +++++++++++++ md/learn/functions/higher-order.md | 28 +++++ md/learn/functions/lambdas.md | 70 +++++++++++++ md/learn/functions/parameters.md | 14 +-- md/learn/index.md | 5 +- md/learn/index.yaml | 46 ++++++-- static/img/desc_thp.jpg | Bin 0 -> 48098 bytes static/index.html | 62 +++++++---- static/js/prism.min.js | 4 + static/js/prism.thp.js | 25 +++++ 29 files changed, 852 insertions(+), 510 deletions(-) create mode 100644 md/learn/adts/union-types.md delete mode 100644 md/learn/basics/io.md delete mode 100644 md/learn/basics/the-compiler.md create mode 100644 md/learn/classes/definition.md create mode 100644 md/learn/classes/static.md create mode 100644 md/learn/collections/arrays.md create mode 100644 md/learn/collections/maps.md create mode 100644 md/learn/collections/sets.md create mode 100644 md/learn/collections/tuples.md delete mode 100644 md/learn/flow-control/foreach.md delete mode 100644 md/learn/flow-control/if-expresions.md create mode 100644 md/learn/flow-control/loops.md delete mode 100644 md/learn/flow-control/while.md create mode 100644 md/learn/functions/declaration.md create mode 100644 md/learn/functions/higher-order.md create mode 100644 md/learn/functions/lambdas.md create mode 100644 static/img/desc_thp.jpg create mode 100644 static/js/prism.min.js create mode 100644 static/js/prism.thp.js diff --git a/md/learn/adts/union-types.md b/md/learn/adts/union-types.md new file mode 100644 index 0000000..ae653b0 --- /dev/null +++ b/md/learn/adts/union-types.md @@ -0,0 +1,51 @@ +# Union types + +## Basic enums + +```thp +enum Suit +{ + Hearts, + Diamonds, + Clubs, + Spades, +} + +val suit = Suit::Hearts +``` + + +## Enums with values + +```thp +enum IpAddress +{ + V4(String), + V6(String), +} + +val addr_1 = IpAddress::V4("192.168.0.1") + +match addr_1 +| IpAddress::V4(ip) +{ + // code.. +} +| IpAddress::V6(ip) +{ + // more code.. +} + +// Without the full qualifier +match addr_1 +| ::V4(ip) +{ + // code... +} +| ::V6(ip) +{ + // even more code... +} +``` + + diff --git a/md/learn/basics/comments.md b/md/learn/basics/comments.md index 04bdbf7..7965040 100644 --- a/md/learn/basics/comments.md +++ b/md/learn/basics/comments.md @@ -1,80 +1,28 @@ # Comments -You may have noticed that in some code examples there are some -lines of text explaining the code: +Only these two: -```thp -// This is the variable -val person = "John" -``` - -Comments are used to explain what the code does. Anything written -in a comment is ignored by THP. - -## Single line comments - -As the name says, these comments span only 1 line. To create one write -two slashes together `//`. Everything after the slashes and before -the newline will be ignored. +## Single line ```thp // This is a single line comment -// You can write anything you want here, although it's usually -// used to describe the code - -// The commend ends where the line ends, -so this line will not be ignored by THP, and will throw an error ``` - -## Multi line comments - -As the name says, these comments can span multiple lines. - -They have 2 components: a start and a end. To start a multiline comment -write a slash and asterisk `/*`, and to end the comment, the inverse `*/` +## Multi line ```thp /* - This is a multiline comment. - I can write whatever I want here, and across multiple - lines, as long as I'm before the closing characters (* /) + This is a + multiline comment +*/ +``` + +```thp +/* + Multiline comments + can be /* nested */ */ ``` -## Using comments to prevent code execution - -Since comments are ignored by THP, we can use them to prevent certain -parts of the code from running. - -Let's say we have this script: - -```thp -print("Hello John") -print("How's your day going?") -``` - -If I wanted the 2nd line not to execute, I can use a comment: - -```thp -print("Hello John") -// print("How's your day going?") -``` - -Now the second line is ignored, and the message is not printed. - -The same can be done with multiline comments. - - -```thp -print("Hello John") -/* -print("How's your day going?") -*/ -``` - - - - diff --git a/md/learn/basics/datatypes.md b/md/learn/basics/datatypes.md index 119cdd6..4af7ee0 100644 --- a/md/learn/basics/datatypes.md +++ b/md/learn/basics/datatypes.md @@ -1,127 +1,45 @@ # Datatypes -Programming is comprised of 2 basic things: instructions and data. +Datatypes's first character are always uppercase. -If we compare a program to a cake recipe, the instructions are the steps -(**pour** flour, **add** water, **add** egg, **mix**) and the data are the ingredients -themselves (flour, water, egg). +## Int -![Image](Image) - -Then, we can describe the recipe in terms of instructions and data. For example, -"mix flour and egg to produce dough". - -![Image](Image) - -All code is like a recipe: A list of instructions and data that, when combined -correctly, are able to transform a input to an output. Many advanced concepts -are just ways to organize and abstract those instructions and data. - - -## Classifying datatypes - -As with food, datatypes can be classified. Just like there are fruits, vegetables, -oils, there are `numbers`, `text`, `"booleans"`. - - - -### Int - -Int is an abbreviation for "integer numbers", which are numbers without a fractional component. -They can be positive or negative. - -In code, they are written just like numbers: +Same as php int ```thp -val age = 33 -val children = 0 -val money = -15000 -``` - -You can use underscores to help you differentiate thousands, millions, etc. -However, there cannot be spaces in between - -```thp -val studentDebt = 3_500_000_000_000 // Valid -val invalid = 3 500 000 000 000 // Invalid, will throw an error -``` - -The common operations can be done as in math: - -```thp -val result1 = 10 + 20 -val result2 = 1779 * 2 - (55 / 5) +Int age = 32 +Int red = 0xff0000 +Int char_code = 0b01000110 ``` -### Float +## Float -Float is an abbreviation for "floating point numbers". In simplified terms, these are numbers -**with** a fractional component. - -They are written with a dot `.` to separate the whole part and the fraction. - -```thp -val pi = 3.141592 -val epsilon = 2.775557 -``` - -Underscore can also be used: - -```thp -val reallyLongNumber = 23_870_000.443_879 -``` - -Common operations can be performed the same way: - -```thp -val value1 = 552.23 - 32 -val value2 = 3.2 * (-0.22 + 23.334) / 0.5 -// etc. -``` - -### String - -A string of letters (technically, characters). Strings are used to represent text, -and are wrapped in quotation marks. - -```thp -val name = "John" -val lastName = "Doe" - -val greeting = "Hello" -``` - -#### Concatenation - -Strings cannot be added, substracted, multiplied, divided. -They have another operation, called "concatenation". - -Concatenation "joins" two strings, for example, the concatenation of -`"human"` and `"kind"` is `"humankind"`. - -As it is a common operation, string concatenation reuses the operation -for addition `+`. - -```thp -val string = "human" + "kind" -``` - - -### Boolean - -A boolean represents something that can only be in one of two states. - -Booleans are useful in conditionals, which will be explained later. +Same as php float ```thp -val condition = true -val isSunny = false - -if isSunny { - doSomething() -} +Float pi = 3.141592 ``` +## String + +Same as php string + +```thp +String name = "Rose" +``` + + +## Bool + +Same as php bool + +```thp +Bool is_true = true +``` + + + + diff --git a/md/learn/basics/hello-world.md b/md/learn/basics/hello-world.md index 692f34a..4338752 100644 --- a/md/learn/basics/hello-world.md +++ b/md/learn/basics/hello-world.md @@ -1,60 +1,9 @@ # Hello, world! -This pages shows you how to write and run your first THP script. - -## Prerequisites - -You will need to have PHP and THP installed. If you haven't already, see the -install page. - -## Writing the program - -Create a new file called `hello.thp`, and inside write the following (you can -copy and paste): +Create a file named `hello.thp` with the contents: ```thp print("Hello, world!") ``` -Then, save the code. - -## Running the program - -Open a terminal in the folder where you created the file `hello.thp`. -Then write the following command and press enter: - -```sh -thp hello.thp -``` - -This will run the program, and produce the following result: - -```sh -Hello, world! -``` - -Congratulations! You just wrote your first THP program! - -## Explaining the program - -Now let's understand the code. - -```thp -print("Hello, world!") -``` - -There are 2 essential components: - -- `print` - print is a "function", it takes some value and performs some action with it. - In this case, it takes a text and displays it in the terminal. -- `"Hello, world!"` - Is the text that the function `print` takes, and displays in - the terminal. Note that it is enclosed in quotation marks. - -## What to do next - -You can now experiment with the program you wrote. What happens if you change the text? -What if you don't put quotation marks? And what are the parenthesis for? - -To continue learning about THP, continue to the next page, where you'll learn -about "datatypes". - +Then run `thp hello.thp` diff --git a/md/learn/basics/io.md b/md/learn/basics/io.md deleted file mode 100644 index 3c7e574..0000000 --- a/md/learn/basics/io.md +++ /dev/null @@ -1,64 +0,0 @@ -# Input & Output - -At the end of the day, a program takes some input, -and transform it to some output. We will explore how to -receive data, and also present it. - -## Output - -There are many ways to show the result of our programs. -One of them is called `standard output`, which in simplified -terms, is the terminal from where we run our program. - -### `print` - -Create an empty file, and name it `hello.php`. We will create -a program that shows a result to our screen. - -Inside `hello.php` write the following code: - -```thp -print("Hello") -``` - -Then, open a terminal and run the program with the `thp` command. -After you press ENTER, you will see in the terminal the text "Hello". - - -```sh -$ thp hello.thp # Copy this command and run it -Hello # This is the output of our program -``` - -The thp function `print` allows us to display something in the terminal. - -If you change the `hello.php` file, and run it, you'll see how it changes. - -```thp -print(322) -``` -```sh -$ thp hello.php -322 -``` - -Or, if you copy `print` multiple times, each will show something in the screen. - -```thp -print("Hello") -print("This is an example") -print("of having many prints") -``` -```sh -$ thp hello.php -Hello -This is an example -of having many prints -``` - -### Using `print` in a larger program - - - - - diff --git a/md/learn/basics/the-compiler.md b/md/learn/basics/the-compiler.md deleted file mode 100644 index 7b25a20..0000000 --- a/md/learn/basics/the-compiler.md +++ /dev/null @@ -1,72 +0,0 @@ -# The compiler - -The compiler is the program that takes your THP code and converts it -into something that the computer can run (in this case, PHP code). - - - -The compiler reads your code and tries to understand it. -When it can't understand some part, it will ask you to clarify what -you meant, with an error. - - - - - - -## Compile time vs runtime - -Compile time is when you build your program. - -Runtime is when you run your program. - -To make an analogy with cars, compile time would be the factory, -while runtime would be using the finished car. - - - -The compiler is very strict. If it finds any errors during compile time -it will refuse to build the program. - - -### Compile time errors - -Compile time errors are errors that happen while the compiler is -building your program. In the car analogy, a compile error would happen -if there's an error in the "blueprint" - - -### Runtime errors - -These are errors that happen to the built program, or in this case, -the finished car. It would be like the car blowing up while on the highway. - -To minimize the amount of runtime errors the compiler tries to catch them all -during compile time. It's better if it fails in the factory than in the -real world. - - -## The compiler and datatypes - -The first measure the compiler takes is to check that all the datatypes -match. If an operation requires a number, you can't just give it a string. - - - -For example, if we wanted to add a number to a string, we would get an -error: - -```thp -50 + "hello" // Error: The `+` operator expects two Numbers, - // but an String was found. -``` - -This way, we can assure that many errors are avoided (since it doesn't -really make sense to add a number to a text). - - - - - - - diff --git a/md/learn/basics/variables.md b/md/learn/basics/variables.md index 8b8e213..a9906b6 100644 --- a/md/learn/basics/variables.md +++ b/md/learn/basics/variables.md @@ -1,138 +1,55 @@ # Variables -Variables allows us to store values under a name, so that we can use them -later. +thp distinguishes between mutable and immutable variables. -For example, in a program we could have the name of our user, and use it -multiple times: +## Mutable variables + +Defined with `var`, followed by a variable name and a value. ```thp -print("Hello, where's Joe?") -print("How old is Joe?") -print("Do you know if Joe has kids?") +var name = "John" +var age = 32 ``` -We are using the same value `Joe` many times. Each time we use it we have -to type `Joe`. But what happens if we needed to use a different name? -We'd have to change the name everywhere in our code! +### Datatype annotation + +Written after the `var` keyword but before the variable name. ```thp -print("Hello, where's Jane?") -print("How old is Jane?") -print("Do you know if Jane has kids?") +var String name = "John" +var Int age = 32 ``` -## Variables to the rescue +When annotating a mutable variable the keyword `var` is _required_. -With a variable we can store values so we can use them later, or use them -in multiple times. -In the previous code, we can use a variable to store the person's name, -and then use it everywhere. +## Immutable variables + +Defined with `val`, followed by a variable name and a value. ```thp -// This is the variable -val person = "John" - -print("Hello, where's {person}?") -print("How old is {person}?") -print("Do you know if Joe has {person}?") +val surname = "Doe" +val year_of_birth = 1984 ``` -Now, instead of writing `"John"` every time, we write the name of the -variable instead. +### Datatype annotation -If we wanted to change the person's name to "Jane", we just need to change -it in one place: the variable +Same as mutable variables ```thp -// We change this -val person = "Jane" - -// And all these lines will use the new value -print("Hello, where's {person}?") -print("How old is {person}?") -print("Do you know if Joe has {person}?") +val String surname = "Doe" +val Int year_of_birth = 1984 ``` -## Variable rules - -To use a variable we do the following: - -- Write the special word `val` -- Write the name of our variable -- Write the equal sign `=` -- Write the value of our variable +When annotating an immutable variable the `val` keyword is optional ```thp - val person = "Jane" -/* --- ------ - ------ - | | | +- The value of our variable - | | +----- The equal sign - | +---------- The name of our variable - +--------------- The special word (keyword) val -*/ +// Equivalent to the previous code +String surname = "Doe" +Int year_of_birth = 1984 ``` -The value can be anything: ints, floats, string, bools, even other variables and operations! - -```thp -val variable_1 = 322 -val variable_2 = 123.456 -val variable_3 = "a text" -val variable_4 = false -val variable_5 = variable_1 + variable 2 -``` - -## Variable name rules - -- Starts with a lowercase letter (a-z) or underscore (`_`) -- Then can have any letter (a-zA-Z), underscore (`_`) or number (0-9) -- Cannot have spaces -- Cannot have the same name as a keyword (for example, the `val` keyword) - - -Some examples of valid variable names: - -```thp -val name = ... -val age = ... -val my_name = ... -val many_words_joined_by_underscores = ... -val person_2 = ... -val person_3 = ... -``` - -Some invalid variables and why they are invalid: - -```thp -val 1name = ... // Invalid: starts with a number -val 123_person = ... // Invalid: starts with a number -val val = ... // Invalid: same name as a keyword (val) -val Person = ... // Invalid: starts with an uppercase letter -val person name = ... // Invalid: contains whitespace -val +@name = ... // Invalid: contains non-letters (+@) -val name🫠 = ... // Invalid: contains emoji (🫠) -``` - - -## Variable reassignment - -When you create a new variable with the same name of an old variable, -the old is "replaced" with the new one. - -```thp -val person_name = "John" -print(person_name) // Will print "John" - -val person_name = "Jane" -print(person_name) // Will print "Jane" -``` - -This will have some implications on the future, but for now you should -now that you will always use the value of the last variable you define. - - +This means that if a variable has only a datatype, it is immutable. diff --git a/md/learn/classes/definition.md b/md/learn/classes/definition.md new file mode 100644 index 0000000..a591827 --- /dev/null +++ b/md/learn/classes/definition.md @@ -0,0 +1,94 @@ +# Classes + +Basically kotlin syntax. + +Methods have to have a first parameter `$`. + + +## Create a new instance of a class + +`new` not required, in fact, forbidden. + +```thp +val dog = Dog() +``` + +## Simple class + +Why'd you do this tho? + +```thp +class SimpleClass + +val instance = SimpleClass() +``` + +## Properties & methods + +```thp +class SimpleClass +{ + // Properties are private by default + var String? name; + + // Made public with `public` + public var String? surname; + + // Methods are private by default + fun display_name($) + { + // `$` is used instead of $this + print($name) + } + + public fun get_name($) -> String? + { + $name + } +} +``` + +## Static members + +no + + +## Constructor + +Kotlin style + + +```thp +class Cat(val String name) +{ + public fun get_name($) -> String + { + $name + } +} + +val michifu = Cat("Michifu") +print(michifu.get_name()) +``` + +## Inheritance + +Kotlin style + +```thp +class Animal(val String name) +{ + public fun say_name($) + { + print($name) + } +} + +class Cat(String name, Int lives) -> Animal(name) + +Cat("Michi", 9).say_name() +``` + + + + diff --git a/md/learn/classes/static.md b/md/learn/classes/static.md new file mode 100644 index 0000000..7691bd1 --- /dev/null +++ b/md/learn/classes/static.md @@ -0,0 +1,48 @@ +# Static in classes + + +## Class constants + +```thp +static Cat { + const CONSTANT = "constant value" +} + +print(Cat::CONSTANT) +``` + + +## Static methods + +aka. plain, old functions + + +```thp +static Cat { + fun static_method() -> Int { + // ... + } +} + +Cat::static_method() +``` + + +## Static properties + +aka. global variables + + +```thp +static Cat { + public var access_count = 0 +} + +print(Cat::access_count) // 0 +Cat::access_count += 1 +print(Cat::access_count) // 1 +``` + + + + diff --git a/md/learn/collections/arrays.md b/md/learn/collections/arrays.md new file mode 100644 index 0000000..ccfeb6a --- /dev/null +++ b/md/learn/collections/arrays.md @@ -0,0 +1,35 @@ +# Arrays + +No destructuring (for now?). There's no `[]` syntax +for constructing arrays + +## Usage + +```thp +val fruits = Array("apple", "banana", "cherry") +val apple = fruits.[0] + +print(apple) + + +var numbers = Array(0, 1, 2, 3) + +// Note the dot +numbers.[3] = 5 + +print(numbers.[3]) // 5 +``` + + +## Type signature + + +```thp +Array[String] +Array[Int] +``` + + + + + diff --git a/md/learn/collections/maps.md b/md/learn/collections/maps.md new file mode 100644 index 0000000..b6d5e3a --- /dev/null +++ b/md/learn/collections/maps.md @@ -0,0 +1,43 @@ +# Maps + +Also known as Associative Arrays + + +## Usage without a declaration + +```thp +var person = Obj { + name: "John", + surname: "Doe", + age: 33, +} + + +print("Hello {person.name}") + +person.age += 1 + +print("You just turned {person.age}") +``` + + +## Usage with a declaration + +```thp +obj Person = { + String name, + String surname, + Int age, +} + + +val john_doe = Person { + name: "John", + surname: "Doe", + age: 33, +} +``` + + + + diff --git a/md/learn/collections/sets.md b/md/learn/collections/sets.md new file mode 100644 index 0000000..357823a --- /dev/null +++ b/md/learn/collections/sets.md @@ -0,0 +1,11 @@ +# Sets + + +```thp +// Set[Int] +val ages = Set(30, 31, 33, 35) + +for age in ages { + print("{age}") +} +``` diff --git a/md/learn/collections/tuples.md b/md/learn/collections/tuples.md new file mode 100644 index 0000000..3db7b71 --- /dev/null +++ b/md/learn/collections/tuples.md @@ -0,0 +1,22 @@ +# Tuples + +Uses `#()` just to avoid confusion with function +calls (`()`). + +## Definition + +```thp +val person = #("John", "Doe", 32) + +val #(name, surname, age) = person +``` + + +## Signature + +```thp +#(String, String, Int) +``` + + + diff --git a/md/learn/flow-control/conditionals.md b/md/learn/flow-control/conditionals.md index d7e57db..0846b95 100644 --- a/md/learn/flow-control/conditionals.md +++ b/md/learn/flow-control/conditionals.md @@ -1,3 +1,57 @@ # Conditionals +- Only `Bool` are accepted. No truthy/falsy. +- Conditionals are expressions. +- Braces are required +- Paretheses for the condition are not required. +- There's no ternary operator + + +```thp +if condition +{ + // code +} +else if condition2 +{ + // more code +} +else +{ + // even more code +} + + +val result = if condition { value1 } else { value2 } +``` + + + +## Check for datatypes + +```thp +if variable is Datatype +{ + // code using variable +} +``` + + +## If variable is of enum + +```thp +val user_id = POST::get("user_id") + +if Some(user_id) = user_id +{ + print("user_id exists: {user_id}") +} + +if Some(user_id) = user_id && user_id > 0 +{ + print("user_id is greater than 0: {user_id}") +} +``` + + diff --git a/md/learn/flow-control/foreach.md b/md/learn/flow-control/foreach.md deleted file mode 100644 index e69de29..0000000 diff --git a/md/learn/flow-control/if-expresions.md b/md/learn/flow-control/if-expresions.md deleted file mode 100644 index e69de29..0000000 diff --git a/md/learn/flow-control/loops.md b/md/learn/flow-control/loops.md new file mode 100644 index 0000000..709cf07 --- /dev/null +++ b/md/learn/flow-control/loops.md @@ -0,0 +1,82 @@ +# Loops + +## For loop + +Braces are required. + +```thp +val numbers = Array(0, 1, 2, 3) + +for number in numbers +{ + print(number) +} + +for #(index, number) in numbers.entries() +{ + print("{index} => {number}") +} +``` + +```thp +val dict = Obj { + "apple": 10, + "banana": 7, + "cherries": 3, +} + +for #(key, value) in dict +{ + print("{key} => {value}") +} +``` + +```thp +for value in collection +{ + if condition + { + break + } +} +``` + + +## While loop + +```thp +val colors = Array("red", "green", "blue") +var index = 0 + +while index < colors.size() +{ + print("{colors.[index]}") + index += 1 +} +``` + + +## Infinite loop + +Basically Rust's loop. + +```thp +loop +{ + print("looping") + + if condition + { + break + } +} +``` + + + + + + + + + diff --git a/md/learn/flow-control/match.md b/md/learn/flow-control/match.md index e69de29..ed2dc14 100644 --- a/md/learn/flow-control/match.md +++ b/md/learn/flow-control/match.md @@ -0,0 +1,56 @@ +# Match + +## Most likely syntax + +```thp +val user_id = POST::get("user_id") + + +match user_id +| Some(id){ print("user_id exists: {id}") } +| None { print("user_id doesn't exist") } + +match user_id +| Some(id) +{ + print("user_id exists: {id}") +} +| None +{ + print("user_id doesn't exist") +} + + +match user_id +| Some(id) if id > 0 +{ + print("user_id exists: {id}") +} +| _ +{ + print("user_id has other values ") +} + + +``` + +## Alternative syntax? + +```thp +// Alternative syntax? + +match user_id { + Some(id) { print("user_id exists: {id}") } + None { print("user_id doesn't exist") } +} + +match user_id { + Some(id) { + print("user_id exists: {id}") + } + None { + print("user_id doesn't exist") + } +} +``` + diff --git a/md/learn/flow-control/while.md b/md/learn/flow-control/while.md deleted file mode 100644 index e69de29..0000000 diff --git a/md/learn/functions/declaration.md b/md/learn/functions/declaration.md new file mode 100644 index 0000000..fb55aa5 --- /dev/null +++ b/md/learn/functions/declaration.md @@ -0,0 +1,70 @@ +# Declaration + + +## No parameters, no return + +```thp +fun say_hello() +{ + print("Hello") +} + +say_hello() +``` + + +## With return type + +```thp +fun get_random_number() -> Int +{ + Random::get(0, 35_222) +} + +val number = get_random_number() +``` + +## With parameters and return type + +```thp +fun get_secure_random_number(Int min, Int max) -> Int +{ + Random::get_secure(min, max) +} + +val number = get_secure_random_number(0, 65535) +``` + + +## Generic types + +```thp +fun get_first_item[T](Array[T] array) -> T +{ + array.[0] +} + +val first = get_first_item[Int](numbers) +// The type annotation is optional if the compiler can infer the type + +val first = get_first_item(numbers) +``` + + +## Signature + + +```thp +() -> () +() -> Int +(Int, Int) -> Int +[T](Array[T]) -> T +``` + + + + + + + + diff --git a/md/learn/functions/higher-order.md b/md/learn/functions/higher-order.md new file mode 100644 index 0000000..d28394b --- /dev/null +++ b/md/learn/functions/higher-order.md @@ -0,0 +1,28 @@ +# Higher Order functions + + +## Function as parameter + +```thp +fun map[A, B](Array[A] input, (A) -> B function) -> Array[B] +{ + // implementation +} + +``` + +## Function as return + +```thp +fun generate_generator() -> () -> Int +{ + // code... +} + + +val generator = generate_generator() // A function +val value = generate_generator()() // An Int +``` + + + diff --git a/md/learn/functions/lambdas.md b/md/learn/functions/lambdas.md new file mode 100644 index 0000000..02e1bb8 --- /dev/null +++ b/md/learn/functions/lambdas.md @@ -0,0 +1,70 @@ +# Lambdas / Anonymous functions + + +## Anonymous function + +```thp +fun(Int x, Int y) -> Int { + x + y +} + + +numbers.map(fun(x) { + x * 2 +}) +``` + + + +## Closure types + +By default closures **always** capture variables as **references**. + + +```thp +var x = 20 + +val f = fun() { + print(x) +} + +f() // 20 + +x = 30 +f() // 30 +``` + + +You can force a closure to capture variables by value. + +```thp +fun(parameters) clone(variables) { + // code +} +``` + +```thp +var x = 20 + +val f = fun() clone(x) { + print(x) +} + +f() // 20 + +x = 30 +f() // 20 +``` + + +## Lambdas + + +```thp +numbers.map { + it * 2 +} +``` + + + diff --git a/md/learn/functions/parameters.md b/md/learn/functions/parameters.md index 5b2e2fc..62e0e31 100644 --- a/md/learn/functions/parameters.md +++ b/md/learn/functions/parameters.md @@ -24,21 +24,21 @@ fun count(Array[Int] numbers) -> Int { ## Mutable reference ```thp -fun add_25(&Array[Int] numbers) { +fun push_25(&Array[Int] numbers) { numbers.push(25) // Ok, will also mutate the original array } ``` Placing a `&` before the type makes the parameter a mutable reference. Mutable methods can be used, and the original -data **will** be mutated. +data **can** be mutated. -The callee *must* also use `&`. +The caller *must* also use `&`. ```thp -val numbers = Array(1, 2, 3, 4) +val numbers = Array(0, 1, 2, 3) -add_25(&numbers) // Pass `numbers` as reference. +push_25(&numbers) // Pass `numbers` as reference. print(numbers(4)) // `Some(25)` ``` @@ -54,13 +54,13 @@ fun add_25(clone Array[Int] numbers) { ``` Using the `clone` keyword before the type creates a mutable copy -of the parameter. The original data will **not** be mutated. +of the parameter (CoW). The original data will **not** be mutated. ```thp val numbers = Array(1, 2, 3, 4) -add_25(&numbers) // Pass `numbers` as reference. +add_25(numbers) // Pass `numbers` as clone. print(numbers(4)) // None ``` diff --git a/md/learn/index.md b/md/learn/index.md index 88c5f7c..a22181e 100644 --- a/md/learn/index.md +++ b/md/learn/index.md @@ -1,3 +1,6 @@ +![Accurate visual description of THP](/img/desc_thp.jpg) + + # Welcome Welcome to the documentation of the THP programming languague. @@ -7,7 +10,7 @@ THP is a new programming language that compiles to PHP.
This page discusses some of the design decitions of the language, -if you want to install THP go to the installation guide](/installation-guide) +if you want to install THP go to the [installation guide](/installation-guide) If you want to learn the language, go to the learn section. diff --git a/md/learn/index.yaml b/md/learn/index.yaml index b4aab1d..a84823a 100644 --- a/md/learn/index.yaml +++ b/md/learn/index.yaml @@ -11,14 +11,10 @@ children: children: - path: hello-world name: Hello, world! - - path: datatypes - name: Datatypes - - path: the-compiler - name: The compiler - name: Variables path: variables - - path: io - name: Input & Output + - path: datatypes + name: Datatypes - path: comments name: Comments - name: Flow control @@ -26,3 +22,41 @@ children: children: - name: Conditionals path: conditionals + - name: Loops + path: loops + - name: Match + path: match +- name: Collections + path: collections + children: + - name: Tuples + path: tuples + - name: Arrays + path: arrays + - name: Maps + path: maps + - name: Sets + path: sets +- name: Functions + path: functions + children: + - name: Declaration + path: declaration + - name: Parameter references + path: parameters + - name: Higher-order functions + path: higher-order + - name: Lambdas + path: lambdas +- name: ADTs + path: adts + children: + - name: Union types + path: union-types +- name: Classes + path: classes + children: + - name: Definition + path: definition + - name: Static + path: static diff --git a/static/img/desc_thp.jpg b/static/img/desc_thp.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b0c3a5b12fe6fbc6aed987a9fa09604ee86606f9 GIT binary patch literal 48098 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

mkujelUqIbe86zVXYNsH^KfqvB@=3#aE1` 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%0D~2fIOc4)Limf6dK;1UF$Kfk8k!tP5O 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%0A_yflQtG1wjp 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 +

-

+

Typed
Hypertext @@ -33,32 +44,34 @@

-
+ + +
-
use Globals::POST
-use JSON
-
-val person_id = POST::get("person_id") ?: die
-
-match Person::find_by_id(person_id) {
-    Ok(person) => {
-        JSON::encode(person)
-    }
-    Err(e) => {
-        JSON::encode(Obj {"error": e})
-    }
-}
-
- +
+                    
+                        val person_id = POST::get("person_id") ?: die
+                        
+                        match Person::find_by_id(person_id)
+                        | Ok(person)
+                        {
+                            JSON::encode(person)
+                        }
+                        | Err(e)
+                        {
+                            JSON::encode(Obj {"error": e})
+                        }                        
+                    
+                
-
+ + + \ No newline at end of file diff --git a/static/js/prism.min.js b/static/js/prism.min.js new file mode 100644 index 0000000..0e561df --- /dev/null +++ b/static/js/prism.min.js @@ -0,0 +1,4 @@ +/* PrismJS 1.29.0 +https://prismjs.com/download.html#themes=prism&plugins=normalize-whitespace */ +var _self="undefined"!=typeof window?window:"undefined"!=typeof WorkerGlobalScope&&self instanceof WorkerGlobalScope?self:{},Prism=function(e){var n=/(?:^|\s)lang(?:uage)?-([\w-]+)(?=\s|$)/i,t=0,r={},a={manual:e.Prism&&e.Prism.manual,disableWorkerMessageHandler:e.Prism&&e.Prism.disableWorkerMessageHandler,util:{encode:function e(n){return n instanceof i?new i(n.type,e(n.content),n.alias):Array.isArray(n)?n.map(e):n.replace(/&/g,"&").replace(/=g.reach);A+=w.value.length,w=w.next){var E=w.value;if(n.length>e.length)return;if(!(E instanceof i)){var P,L=1;if(y){if(!(P=l(b,A,e,m))||P.index>=e.length)break;var S=P.index,O=P.index+P[0].length,j=A;for(j+=w.value.length;S>=j;)j+=(w=w.next).value.length;if(A=j-=w.value.length,w.value instanceof i)continue;for(var C=w;C!==n.tail&&(jg.reach&&(g.reach=W);var z=w.prev;if(_&&(z=u(n,z,_),A+=_.length),c(n,z,L),w=u(n,z,new i(f,p?a.tokenize(N,p):N,k,N)),M&&u(n,w,M),L>1){var I={cause:f+","+d,reach:W};o(e,n,t,w.prev,A,I),g&&I.reach>g.reach&&(g.reach=I.reach)}}}}}}function s(){var e={value:null,prev:null,next:null},n={value:null,prev:e,next:null};e.next=n,this.head=e,this.tail=n,this.length=0}function u(e,n,t){var r=n.next,a={value:t,prev:n,next:r};return n.next=a,r.prev=a,e.length++,a}function c(e,n,t){for(var r=n.next,a=0;a"+i.content+""},!e.document)return e.addEventListener?(a.disableWorkerMessageHandler||e.addEventListener("message",(function(n){var t=JSON.parse(n.data),r=t.language,i=t.code,l=t.immediateClose;e.postMessage(a.highlight(i,a.languages[r],r)),l&&e.close()}),!1),a):a;var g=a.util.currentScript();function f(){a.manual||a.highlightAll()}if(g&&(a.filename=g.src,g.hasAttribute("data-manual")&&(a.manual=!0)),!a.manual){var h=document.readyState;"loading"===h||"interactive"===h&&g&&g.defer?document.addEventListener("DOMContentLoaded",f):window.requestAnimationFrame?window.requestAnimationFrame(f):window.setTimeout(f,16)}return a}(_self);"undefined"!=typeof module&&module.exports&&(module.exports=Prism),"undefined"!=typeof global&&(global.Prism=Prism); +!function(){if("undefined"!=typeof Prism){var e=Object.assign||function(e,t){for(var n in t)t.hasOwnProperty(n)&&(e[n]=t[n]);return e},t={"remove-trailing":"boolean","remove-indent":"boolean","left-trim":"boolean","right-trim":"boolean","break-lines":"number",indent:"number","remove-initial-line-feed":"boolean","tabs-to-spaces":"number","spaces-to-tabs":"number"};n.prototype={setDefaults:function(t){this.defaults=e(this.defaults,t)},normalize:function(t,n){for(var r in n=e(this.defaults,n)){var i=r.replace(/-(\w)/g,(function(e,t){return t.toUpperCase()}));"normalize"!==r&&"setDefaults"!==i&&n[r]&&this[i]&&(t=this[i].call(this,t,n[r]))}return t},leftTrim:function(e){return e.replace(/^\s+/,"")},rightTrim:function(e){return e.replace(/\s+$/,"")},tabsToSpaces:function(e,t){return t=0|t||4,e.replace(/\t/g,new Array(++t).join(" "))},spacesToTabs:function(e,t){return t=0|t||4,e.replace(RegExp(" {"+t+"}","g"),"\t")},removeTrailing:function(e){return e.replace(/\s*?$/gm,"")},removeInitialLineFeed:function(e){return e.replace(/^(?:\r?\n|\r)/,"")},removeIndent:function(e){var t=e.match(/^[^\S\n\r]*(?=\S)/gm);return t&&t[0].length?(t.sort((function(e,t){return e.length-t.length})),t[0].length?e.replace(RegExp("^"+t[0],"gm"),""):e):e},indent:function(e,t){return e.replace(/^[^\S\n\r]*(?=\S)/gm,new Array(++t).join("\t")+"$&")},breakLines:function(e,t){t=!0===t?80:0|t||80;for(var n=e.split("\n"),i=0;it&&(o[l]="\n"+o[l],a=s)}n[i]=o.join("")}return n.join("\n")}},"undefined"!=typeof module&&module.exports&&(module.exports=n),Prism.plugins.NormalizeWhitespace=new n({"remove-trailing":!0,"remove-indent":!0,"left-trim":!0,"right-trim":!0}),Prism.hooks.add("before-sanity-check",(function(e){var n=Prism.plugins.NormalizeWhitespace;if((!e.settings||!1!==e.settings["whitespace-normalization"])&&Prism.util.isActive(e.element,"whitespace-normalization",!0))if(e.element&&e.element.parentNode||!e.code){var r=e.element.parentNode;if(e.code&&r&&"pre"===r.nodeName.toLowerCase()){for(var i in null==e.settings&&(e.settings={}),t)if(Object.hasOwnProperty.call(t,i)){var o=t[i];if(r.hasAttribute("data-"+i))try{var a=JSON.parse(r.getAttribute("data-"+i)||"true");typeof a===o&&(e.settings[i]=a)}catch(e){}}for(var l=r.childNodes,s="",c="",u=!1,m=0;m]=?|[!=]=?=?|--?|\$|\+\+?|&&?|\|\|?|[?*/~^%]/, + "punctuation": /[{}[\];(),.]/, + "boolean": /\b(?:false|true)\b/, + "class-name": /\b[A-Z][a-zA-Z_0-9]+\b/, + "variable": /\b[a-z_0-9][a-zA-Z_0-9]+:/, +}; \ No newline at end of file