More changes to the README because yes
This commit is contained in:
parent
fd90d08688
commit
096bfaf662
25
README.md
25
README.md
|
@ -80,7 +80,30 @@ Misc:
|
||||||
- method-like call syntax without actual methods (dispatched at compile-time) [ ]
|
- method-like call syntax without actual methods (dispatched at compile-time) [ ]
|
||||||
- ... More?
|
- ... More?
|
||||||
|
|
||||||
|
|
||||||
|
## Features
|
||||||
|
|
||||||
|
Aside from the obvious basics like exceptions, a true import system with namespaces and a standard library (duh), here's a
|
||||||
|
random list of high-level features I plan peon to have and that I think are kinda neat:
|
||||||
|
- References not being nullable by default (must use `#pragma[nullable]`)
|
||||||
|
- Easy C/Nim interop via FFI
|
||||||
|
- C/C++ backend
|
||||||
|
- Nim backend (maybe)
|
||||||
|
- Structured concurrency
|
||||||
|
- Capability-based programming (i.e. functions are passed objects to act on the real world)
|
||||||
|
- Parametric Polymorphism (with untagged typed unions and maybe interfaces)
|
||||||
|
- Simple OOP (with multiple dispatch!)
|
||||||
|
- RTTI, with methods that dispatch at runtime based on the true type of a value (maybe)
|
||||||
|
- Limited compile-time evaluation (embed the Peon VM in the C/C++/Nim backend and use that to execute peon code at compile time)
|
||||||
|
|
||||||
|
|
||||||
## The name
|
## The name
|
||||||
|
|
||||||
The name for peon comes from my and [Productive2's](https://git.nocturn9x.space/prod2) genius and is a result of shortening
|
The name for peon comes from my and [Productive2's](https://git.nocturn9x.space/prod2) genius and is a result of shortening
|
||||||
the name of the fastest animal on earth: the **Pe**regrine Falc**on**. I guess I wanted this to mean peon will be blazing fast
|
the name of the fastest animal on earth: the **Pe**regrine Falc**on**. I guess I wanted this to mean peon will be blazing fast
|
||||||
|
|
||||||
|
# Peon needs you.
|
||||||
|
|
||||||
|
No, but really. I need help. This project is huge and (IMHO) awesome, but there's a lot of non-trivial work to do and doing
|
||||||
|
it with other people is just plain more fun and rewarding. If you want to get involved, definitely try [contacting](https://nocturn9x.space/contact) me
|
||||||
|
or open an issue/PR!
|
|
@ -44,11 +44,14 @@ For somewhat updated tests, check the [tests](../tests/) directory.
|
||||||
### Variable declarations
|
### Variable declarations
|
||||||
|
|
||||||
```
|
```
|
||||||
var x = 5; # Inferred type is int64
|
var x = 5; # Inferred type is int64
|
||||||
var y = 3'u16; # Type is specified as uint16
|
var y = 3'u16; # Type is specified as uint16
|
||||||
x = 6; # Works: type matches
|
x = 6; # Works: type matches
|
||||||
x = 3.0; # Cannot assign float64 to x
|
x = 3.0; # Error: Cannot assign float64 to x
|
||||||
var x = 3.14; # Cannot re-declare x
|
var x = 3.14; # Error: Cannot re-declare x
|
||||||
|
const z = 6.28; # Constant declaration
|
||||||
|
let a = "hi!"; # Cannot be reassigned/mutated
|
||||||
|
var b: int32 = 5; # Explicit type declaration
|
||||||
```
|
```
|
||||||
|
|
||||||
__Note__: Peon supports [name stropping](https://en.wikipedia.org/wiki/Stropping_(syntax)), meaning
|
__Note__: Peon supports [name stropping](https://en.wikipedia.org/wiki/Stropping_(syntax)), meaning
|
||||||
|
@ -108,7 +111,7 @@ __Note__: Code the likes of `a.b()` is desugared to `b(a)` if there exists a fun
|
||||||
which case the attribute resolution takes precedence)
|
which case the attribute resolution takes precedence)
|
||||||
|
|
||||||
|
|
||||||
### Generic declarations
|
### Generics
|
||||||
|
|
||||||
```
|
```
|
||||||
fn genericSum[T: Number](a, b: T): T { # Note: "a, b: T" means that both a and b are of type T
|
fn genericSum[T: Number](a, b: T): T { # Note: "a, b: T" means that both a and b are of type T
|
||||||
|
@ -122,7 +125,7 @@ genericSum(3.14, 0.1);
|
||||||
genericSum(1'u8, 250'u8);
|
genericSum(1'u8, 250'u8);
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Multiple generics
|
#### More generics!
|
||||||
|
|
||||||
```
|
```
|
||||||
fn genericSth[T: someInterface, K: someInterface2](a: T, b: K) { # Note: no return type == void function!
|
fn genericSth[T: someInterface, K: someInterface2](a: T, b: K) { # Note: no return type == void function!
|
||||||
|
@ -132,6 +135,18 @@ fn genericSth[T: someInterface, K: someInterface2](a: T, b: K) { # Note: no ret
|
||||||
genericSth(1, 3.0);
|
genericSth(1, 3.0);
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
#### Even more generics?
|
||||||
|
|
||||||
|
```
|
||||||
|
type Box*[T: SomeNumber] = object {
|
||||||
|
num: T;
|
||||||
|
}
|
||||||
|
|
||||||
|
var boxFloat = Box[float](1.0);
|
||||||
|
var boxInt = Box[int](1);
|
||||||
|
```
|
||||||
|
|
||||||
__Note__: The `*` modifier to make a name visible outside the current module must be put
|
__Note__: The `*` modifier to make a name visible outside the current module must be put
|
||||||
__before__ generics declarations, so only `fn foo*[T](a: T) {}` is the correct syntax
|
__before__ generics declarations, so only `fn foo*[T](a: T) {}` is the correct syntax
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue