Skip to content

Latest commit

 

History

History
421 lines (308 loc) · 6.93 KB

README.md

File metadata and controls

421 lines (308 loc) · 6.93 KB

Zeus

An OOP programming language in development that combines an advanced type system inspired by TypeScript, the syntax simplicity of Python, and the ideas and efficiency of Rust and C++. Written in C++ using LLVM.

Design Playground

Primitive Types
str
u8
i8
u16
i16
u32
i32
u64
i64
float

money = 123
money: u16

void f(uint8 number) {
    return number + 123
}

Types
Object
String
Vector
BigNumber

Initial idea - Python, TypeScript and Rust combination

language = ({statement}\n)*
statement = {variable_assignment_statement}|{variable_operation_statement}|{function_definition_statement}|{if_else_statement}|{for_loop_statement}|{while_loop_statement}
expression_statement = {expression}
variable_assignment_statement = {definition_identifier}\( *: *{identifier}\)? *= *{expression}
variable_operation_statement = {definition_identifier} *{assignment_operator} *{expression}
function_definition_statement = fn +{definition_identifier} *\{{language}\}
expression = {number_expression}|{string_expression}|{identifier}|{operator_usage_expression}|{call_expression}|\({expression}\)
operator_usage_expression = {expression}{binary_operator}{expression} | {unary_operator}{expression}
unary_operator = !|~
binary_operator = +|-|/|*|^|%|\?|==|!=|<|>|<=|>=|:
assignment_operator = +=|-=|/=|*=|%=|\?=
call_expression = {identifier}({expression},( *{expression})*)

string_expression = "{character}*"|'{character}*'
character = ...

float_number_expression = {float_number}
float_number = {digit}+.{digit}+

number_expression = {number}
number = {decimal_number}|{hex_number}|{binary_number}
decimal_number = -?{digit}+
hex_number = 0x-?{digit}+
binary_number = 0b-?{digit}+
decimal_digit = 0|1|2|3|4|5|6|7|8|9
hex_digit = 0|1|2|3|4|5|6|7|8|9|a|A|b|B|c|C|d|D|e|E|f|F
binary_digit = 0|1

stream = Stream.from([1, 2, 3])
stream |= map()
stream |= filter(fn () {return 2})

stream = users.map(fn (user) => user.name).first()
stream = user.name for user in users if user != "dan"
animal = "cat" if isCat else "dog"
[u for u in users if u != 3]

file ? 2
if (file ?

list[12:23]

type User {
    firstName: str,
    lastName: str
}

trait Mappable {
    map(f): Whatever
}

class User {
    User() {

    }

    fn f() {

    }
}

impl Mappable for Vector {
    map(f):
}

fn main(): int {
    return 0;
}

# or #

class User {
    User() {

    }
}

fn main(): int32 {
    user1 = User()

    for x in range() {

    }

    user1.create()

    return 1;
}

for x in

Features:

Knowledge of type limitations for example after `x: Optional<int32> = null; if (x != null) { y = x + 32 }`

class Optional<int32> {
    operator()
}

213321
0123x = 123

"string_literal"
0.100123
1243
0x123AB
0b101
true
false
water100

Atom -> StringLiteral
BooleanLiteral
IdentifierLiteral

<variable_name>: <type> = <value>

a = socket() // creates a socket

Source(statements: [
    Statement(),
    
])

interface Users {
    [''] for key in users if
}

class Users {
    id: number;
    name: str;
    age: number;
}

class Type {
    void mem();
}

User = Class(name: "User", members: [
    Property(name: "name", type: Type),
    Method(name: "name",
        args: [MethodArg(name: "", type: Type)],
        returnType: Type,
        content: (file) => {}
    )
])

function find(user: User) {}

trait Printable {

}

type user = Class<members: [
    
]>

fn gql<code: str>: GraphQLType {
   http.request("server/graphql.schema")
}

optional<User>(name)

variable | type 

UsersQuery = gql<"
    query {
        users
    }
">;

apollo.query<UsersQuery>().users

fn printable<T: Type>() {
    return T.withAdded([]);
}

@inject
class User {

}

class Default<T: Type, default: T> {
    
}

petNamesByUsername : Map<key: String, value: Default<Vector<String>, []>>

class Users {
    public get(id: User['id']): User {
        
    }
}

user: create<User>

router(
    route(address) { pageByAddress(address) },
    value: 
)

interface UserCreationDetails {
    name: String
    age: i32
}

class User {
    User(@inject() db: Users, ...details: UserCreationDetails) {
        db.users.create({name: details.name, age: details.age});
    }
    
    User.of(UserDetails details) {
        // work
    }
    
    order(product: Product) {
        
    }
    
    details() {
        // work
    }
}

class Product {
    Product() {
    
    }
}

user = User()
user = User.of(users.get('123'))

fn order(user: e.User, product: e.Product) {

}

class Orde

FireService = FireService.injected(usersService: usersService)

fn f(user: User) {
   create(user)
   Order(user, users)
}

class User {

}

trait StringRepresentable {
    str toString()
}

implement StringRepresentable for 

compilation void file() {

}

compilation x = 2;

class User {
    
}

type A = {};

data class Optional<T> {
    [member.signature(): ] for member in T.props()
}

interface MachineGun {
    key for key in Users
    key for key in Master
}

interface MegaUsers = Union<Users, MachineGun>

var: (types['']) = {}

if x is y:
fn gql<code: str>: GraphQLType {
   result = http.request<"server/graphql.schema">
   return result
}
fn getRoute<router: Router, route: String>: Route {
    items = Vec<i32>
    items.add<123>
    return items

    for r in router.routes<> {
       if r.maches(route) {
            return r
       }
    }
    return NotFoundRoute()
}

trait StringRepresentable {
    toString(): String
}
StringRepresentable = Trait<members: [
    Method<name: "toString",
        args: [],
        returnType: String>
]>

class User {
    name: String
    age: i32
}
User = Trait<members: [
    Property<name: "name", type: String>,
    Property<name: "age", type: i32>
]>

imlp StringRepresentable for User {
    String toString() {
        return "User { " + name + ", " + String.from(age) + "}"
    }
}
StringRepresentable = Type<members: {
    Method<name: "toString",
        args: [],
        returnType: String> : Language<statements: [
            Return<value: 
                BinaryOperator<
                    String("User {"),
                    Identifier("name"),
                    String(", "),
                    Whatever,
                    String("}")
                >
            >
        ]>
}>

fn deepPartial<T: Type> {
    if (T is PrimitiveType) {
        return partial<T>;
    }
    
    if (T is Optional) {
        return deepPartial<T.type<>>;
    }

    return Type<
        properties: [Property<name: name, type: deepPartial<type>> for { name, type } in T.properties<>],
        methods: [Method<name: name, args: args, returnType: deepPartial<type>> for { name, args, type } in T.methods<>]
    >   
}

class Complex {
    Complex(i32 real, Optional<i32> imaginary, bool gpu) {
    
    }
}
Complex(0, gpu: True)

x = 123
x += 134
x += 12342
x += 234343
return x

Steps:
Lexer
Parser
Doing what can done at compile time -> X can be done if every Y that it depends on can
-> All logic but things that require runtime or can be changed in runtime

trait DeeplyPrintable extends Printable, Useful {
    
}

class User implements DeeplyPrintable {
    
}