/DynamicC

initial commit

Primary LanguageJetBrains MPS

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