283 lines
5.1 KiB
Plaintext
283 lines
5.1 KiB
Plaintext
---
|
|
layout: ../../layouts/PagesLayout.astro
|
|
title: Welcome
|
|
pagesLayout:
|
|
- path: index
|
|
- path: install
|
|
- path: basics
|
|
title: Basics
|
|
children:
|
|
- path: hello-world
|
|
- path: variables
|
|
- path: datatypes
|
|
- path: comments
|
|
- path: operators
|
|
- path: flow-control
|
|
title: Flow control
|
|
children:
|
|
- path: conditionals
|
|
- path: loops
|
|
- path: match
|
|
- path: blocks
|
|
- path: data-structures
|
|
title: Data structures
|
|
children:
|
|
- path: tuples
|
|
- path: arrays
|
|
- path: maps
|
|
- path: enums
|
|
- path: functions
|
|
title: Functions
|
|
children:
|
|
- path: declaration
|
|
- path: parameters
|
|
- path: higher-order
|
|
- path: lambdas
|
|
- path: error-handling
|
|
title: Error handling
|
|
children:
|
|
- path: "null"
|
|
- path: try
|
|
- path: classes
|
|
title: Classes
|
|
children:
|
|
- path: definition
|
|
- path: static
|
|
- path: interfaces
|
|
- path: anonymous
|
|
- path: magic
|
|
---
|
|
import InteractiveCode from "../../components/InteractiveCode.astro";
|
|
|
|
|
|
# Welcome
|
|
|
|
Welcome to the documentation of the THP programming languague.
|
|
|
|
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](install)
|
|
|
|
|
|
## Interactive execution
|
|
|
|
The documentation contains snippets of interactive THP code, like this:
|
|
|
|
<InteractiveCode
|
|
code={`
|
|
val x = "android"
|
|
var y = 17
|
|
|
|
fun f(Int a, Int b) {
|
|
print("hello, {a} {b}")
|
|
}
|
|
|
|
f(x, y)
|
|
`}
|
|
steps={`
|
|
step {line 1}
|
|
step {
|
|
line 2
|
|
set "String x" "\\"android\\""
|
|
}
|
|
step {
|
|
line 8
|
|
set "Int y" "17"
|
|
}
|
|
step {line 4}
|
|
step {line 5}
|
|
step {
|
|
out "hello, android 17"
|
|
line 6
|
|
}
|
|
step {line 8}
|
|
step {line 0}
|
|
`}
|
|
></InteractiveCode>
|
|
|
|
Use the `Step` and `Reset` buttons to emulate the execution of a
|
|
THP program!
|
|
|
|
## Goals
|
|
|
|
- Bring static typing to PHP: Not just type hints, not just `mixed` for everything
|
|
that isn't a primitive type.
|
|
- Generics & ADTs
|
|
- Avoid implicit type conversion.
|
|
- Remove the inconsistencies in the language.
|
|
- Organize the stdlib into modules.
|
|
- Differentiate between Arrays, Tuples, Maps and Sets.
|
|
- Create a **consistent** language.
|
|
- Have typings for popular libraries (like TS's `.d.ts`).
|
|
- Have a simple instalation and configuration (requiring just Composer).
|
|
- Ship a fast, native binary (written in Rust) (why use PHP when we can go **_blazingly fast_**?).
|
|
- Support in-place compilation.
|
|
- (Try to) emit readable PHP.
|
|
- Implement an LSP server.
|
|
- Implement a formatter.
|
|
|
|
|
|
## Not goals
|
|
|
|
These are **not** aspects that THP looks to solve or implement.
|
|
|
|
- Be what TypeScript is for JavaScript (PHP with types).
|
|
- Use PHP syntax/conventions.
|
|
- Be familiar for PHP developers.
|
|
|
|
|
|
## Philosophy
|
|
|
|
- Consistency over familiarity
|
|
- Change over conventions
|
|
- Explicit over implicit
|
|
|
|
|
|
## Some differences with PHP
|
|
|
|
```thp
|
|
// PHP
|
|
$has_key = str_contains($haystack, 'needle');
|
|
|
|
// THP
|
|
val has_key = haystack.contains("needle")
|
|
```
|
|
|
|
- Explicit variable declaration
|
|
- No `$` for variable names (and thus no `$$variable`)
|
|
- No semicolons
|
|
- Use methods on common datatypes
|
|
- Strings use only double quotes
|
|
|
|
---
|
|
|
|
```thp
|
|
// PHP
|
|
[
|
|
'names' => ['Toni', 'Stark'],
|
|
'age' => 33,
|
|
'numbers' => [32, 64, 128]
|
|
]
|
|
|
|
// THP
|
|
.{
|
|
names: #("Toni", "Stark"), // Tuple
|
|
age: 33,
|
|
numbers: [32, 64, 128]
|
|
}
|
|
```
|
|
|
|
- Tuples, Arrays, Sets, Maps are clearly different
|
|
- JSON-like object syntax
|
|
|
|
---
|
|
|
|
```thp
|
|
// PHP
|
|
$cat = new Cat("Michifu", 7);
|
|
$cat->meow();
|
|
|
|
// THP
|
|
val cat = Cat("Michifu", 7)
|
|
cat.meow();
|
|
```
|
|
|
|
- No `new` for classes
|
|
- Use dot `.` instead of arrow `->` syntax
|
|
|
|
---
|
|
|
|
|
|
```thp
|
|
// PHP
|
|
use \Some\Deeply\Nested\Class
|
|
use \Some\Deeply\Nested\Interface
|
|
|
|
// THP
|
|
use Some::Deeply::Nested::{Class, Interface}
|
|
```
|
|
|
|
- Different module syntax
|
|
- Explicit module declaration
|
|
- PSR-4 required
|
|
- No `include`, `include_once`, `require` or `require_once`
|
|
|
|
---
|
|
|
|
Other things:
|
|
|
|
- Pattern matching
|
|
- ADTs
|
|
|
|
|
|
## Runtime changes
|
|
|
|
Where possible THP will compile to available PHP functions/classes/methods/etc.
|
|
|
|
For example:
|
|
|
|
```thp
|
|
// This expression
|
|
val greeting =
|
|
match get_person()
|
|
| Some(person) if person.age > 18
|
|
{
|
|
"Welcome, {person.name}"
|
|
}
|
|
| Some(person)
|
|
{
|
|
"I'm sorry {person.name}, you need to be 18 or older"
|
|
}
|
|
| None
|
|
{
|
|
"Nobody is here"
|
|
}
|
|
|
|
|
|
// Would compile to:
|
|
$greeting = null;
|
|
$_person = get_person();
|
|
if ($_person !== null) {
|
|
if ($_person["age"] > 18) {
|
|
$greeting = "Welcome, " . $_person["name"];
|
|
}
|
|
else {
|
|
$greeting = "I'm sorry " . $_person["name"] . ", you need to be 18 or older";
|
|
}
|
|
}
|
|
else {
|
|
$greeting = "Nobody is here";
|
|
}
|
|
```
|
|
|
|
However, more advanced datatypes & helper functions will require a sort of
|
|
runtime (new classes/functions/etc) or abuse the language's syntax/semantics.
|
|
|
|
|
|
```thp
|
|
// TBD: Enum compilation
|
|
enum IpAddress {
|
|
V4(String),
|
|
V6(String),
|
|
}
|
|
|
|
val ip_1 = IpAddress::V4("255.255.0.0")
|
|
|
|
|
|
// Would possibly compile to:
|
|
enum IpAddress {
|
|
V4,
|
|
V6,
|
|
}
|
|
|
|
$ip_1 = [IpAddress::V4, "255.255.0.0"]
|
|
```
|
|
|
|
Such changes will be documented
|
|
|
|
|