Update README
This commit is contained in:
56
README.md
56
README.md
@@ -4,15 +4,11 @@ A compiled language that assumes C as base reality but it also has lots of ideas
|
|||||||
|
|
||||||
The language is currently **very debuggable**. It can produce readable C code with line directives. This allows you to debug the programs with Visual Studio with full source mapping, exactly like you would debug C programs.
|
The language is currently **very debuggable**. It can produce readable C code with line directives. This allows you to debug the programs with Visual Studio with full source mapping, exactly like you would debug C programs.
|
||||||
|
|
||||||
## Language examples
|
## Using Windows API example
|
||||||
|
|
||||||
* More examples can be found in /examples and /modules
|
* More examples can be found in /examples and /modules
|
||||||
|
|
||||||
``` C
|
```
|
||||||
//
|
|
||||||
// Virtual memory abstraction using Windows API
|
|
||||||
//
|
|
||||||
|
|
||||||
#import "KERNEL32.core"
|
#import "KERNEL32.core"
|
||||||
#import "Base.core"
|
#import "Base.core"
|
||||||
|
|
||||||
@@ -29,7 +25,10 @@ Allocate :: (size: U64): *void
|
|||||||
return HeapAlloc(ProcessHeap, 0, size)
|
return HeapAlloc(ProcessHeap, 0, size)
|
||||||
|
|
||||||
Reserve :: (size: SizeU): Memory
|
Reserve :: (size: SizeU): Memory
|
||||||
|
// C like compound expressions with named arguments
|
||||||
result := Memory{reserve=AlignUp(size, PAGE_SIZE)}
|
result := Memory{reserve=AlignUp(size, PAGE_SIZE)}
|
||||||
|
|
||||||
|
// Named arguments to function calls
|
||||||
result.data = VirtualAlloc(
|
result.data = VirtualAlloc(
|
||||||
flProtect = PAGE_READWRITE,
|
flProtect = PAGE_READWRITE,
|
||||||
dwSize = result.reserve,
|
dwSize = result.reserve,
|
||||||
@@ -63,10 +62,53 @@ Release :: (m: *Memory)
|
|||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Operator overload example
|
||||||
|
|
||||||
|
```
|
||||||
|
"-" :: (a: Vec3, b: Vec3): Vec3 ;; return {a.x-b.x, a.y-b.y, a.z-b.z}
|
||||||
|
"-" :: (a: Vec3): Vec3 ;; return {-a.x, -a.y, -a.z }
|
||||||
|
```
|
||||||
|
|
||||||
|
## Unicode conversion example
|
||||||
|
|
||||||
|
```
|
||||||
|
Utf8ToUtf32 :: (c: *U8, max_advance: S64): U32, S64
|
||||||
|
out_str: U32
|
||||||
|
advance: S64
|
||||||
|
if (c[0] & 0b10000000) == 0
|
||||||
|
if max_advance >= 1
|
||||||
|
c0 := c[0]->U32
|
||||||
|
out_str = c0
|
||||||
|
advance = 1
|
||||||
|
|
||||||
|
elif (c[0] & 0b11100000) == 0b11000000
|
||||||
|
if (c[1] & 0b11000000) == 0b10000000 // Continuation byte required
|
||||||
|
if max_advance >= 2
|
||||||
|
c0 := c[0]->U32; c1 := c[1]->U32
|
||||||
|
out_str = (c0 & 0b00011111) << 6 | (c1 & 0b00111111)
|
||||||
|
advance = 2
|
||||||
|
|
||||||
|
elif (c[0] & 0b11110000) == 0b11100000
|
||||||
|
if (c[1] & 0b11000000) == 0b10000000 && (c[2] & 0b11000000) == 0b10000000 // Two continuation bytes required
|
||||||
|
if max_advance >= 3
|
||||||
|
c0 := c[0]->U32; c1 := c[1]->U32; c2 := c[2]->U32
|
||||||
|
out_str = (c0 & 0b00001111) << 12 | (c1 & 0b00111111) << 6 | (c2 & 0b00111111)
|
||||||
|
advance = 3
|
||||||
|
|
||||||
|
elif (c[0] & 0b11111000) == 0b11110000
|
||||||
|
if (c[1] & 0b11000000) == 0b10000000 && (c[2] & 0b11000000) == 0b10000000 && (c[3] & 0b11000000) == 0b10000000 // Three continuation bytes required
|
||||||
|
if max_advance >= 4
|
||||||
|
c0 := c[0]->U32; c1 := c[1]->U32; c2 := c[2]->U32; c3 := c[3]->U32
|
||||||
|
out_str = (c0 & 0b00001111) << 18 | (c1 & 0b00111111) << 12 | (c2 & 0b00111111) << 6 | (c3 & 0b00111111)
|
||||||
|
advance = 4
|
||||||
|
|
||||||
|
return out_str, advance
|
||||||
|
```
|
||||||
|
|
||||||
## What's missing ?
|
## What's missing ?
|
||||||
|
|
||||||
- [x] Constant evaluation and constant folding - Folding and precomputing every expression that can be calculated at compile time. Which allows to check if a given constant expression is actually something that can be computed at compile time
|
- [x] Constant evaluation and constant folding - Folding and precomputing every expression that can be calculated at compile time. Which allows to check if a given constant expression is actually something that can be computed at compile time
|
||||||
- [ ] Constant expressions with concrete types
|
- [ ] Constant expressions with concrete types without casting
|
||||||
|
|
||||||
- [x] Untyped types - Context dependent type assignment of constant expressions, this is a feature I really loved in Go, it makes constants work very well with a very strict type system and it makes errors like overflow of constants in C due to bad size specifier impossible
|
- [x] Untyped types - Context dependent type assignment of constant expressions, this is a feature I really loved in Go, it makes constants work very well with a very strict type system and it makes errors like overflow of constants in C due to bad size specifier impossible
|
||||||
- [x] Infinite precision integers in constants
|
- [x] Infinite precision integers in constants
|
||||||
|
|||||||
Reference in New Issue
Block a user