Files
DynamicC/README.md
2019-12-19 01:28:45 +01:00

109 lines
2.1 KiB
Markdown

# DynamicC
A syntactically nice language that compiles to C99
Built using JetBrains MPS, Code is written in a *projectional editor*.
## Features
### Modern Syntax
Syntax is heavily inspired by Kotlin, and does not aim for compatibility with C.
### Safe Memory Access
Todo;
### Tuples
Todo;
```
val a: (int8, byte32) = (7, 9)
```
### Named Maps
We all know these are just structs.
```
map A {
a: int8
b: byte32
}
```
### Named Function Parameter Access
Todo;
```
fun foo(a: int8, b: int32?, c: byte8) { ... }
foo(c: 16, a: 63)
```
### Default Parameters
Todo;
```
fun foo(a: int8 = 16) { ... }
// a will be 16
foo()
// a will be 32
foo(32)
```
### Template Strings
Todo;
```
val a: int32 = 16
"This int is {a}"
```
### Generics
Todo;
```
fun foo<T, G>(a: T): G {
...
}
foo<int32, int32>(23, 54)
```
### Cleaned Up Types
C99 comes with so many unclear types, it's actually insane to keep track of. We use instead `uint8..128`, `int8..128`, `byte8..128` and `float32..128` for most things.
### Rudimentary Classes
I promise, these are optional. In many cases it can be useful if a struct can posess a function that does stuff on it, so it
essentially just creates a function that takes the struct as an additional parameter. I don't really plan to add inheritance or
any of the more advanced features though.
### Strong and weak types
Coming from TypeScript, it was especially important to me to be able to define types aliases that are incompatible (`strong type`)
and type aliases that can be used interchangeably (`weak type`).
```
strong type ReturnCode from int8
var a: ReturnCode = 0
val b: int8 = 1
// Error: ReturnCode can't be assigned to int8
a = b
// Use this if you want to assign it anyways
a = b as int8
```
### Multi Assignments
I saw this feature in Crystal, and wanted it here.
```
int a: int8 = 1;
int b: int8 = 2;
a, b = b, a
```
### Null Safety
Similar to Kotlin, you can't assign a variable the value `null` unless you mark it nullable:
```
// Error: a can't be null
val a: int8 = null
// If you need it to be null, use this instead
val b: int8? = null
```