Skip to content

DiscoBiscuit99/honey

Repository files navigation

Honey, I'm home 🍯

A very sophisticated, compiled programming language made for household use alone. 🐝

Features: #todo

  • Constant propagation
  • Single static assignment
  • Dead code elimination
  • Interoperability with C

Example code:

# this is a comment...

# basic "variable" declarations
let a: number = 1;      # result: a <- 1
mut b: number = a + 1;  # result: b <- a + 1
b += a;                 # result: b <- b + a

# tuples
# components data types should probably be the same
let some_tuple: (number, number) = (1, 2);

# tagged tuples
let tagged_tuple: (x: number, y: number) = (3, 4);
println("{tagged_tuple.x}, {tagged_tuple.y}");

# basic (single-variate) function/procedure declarations
let double_me: (x: number) -> number = {
    x * 2
};

# multi-variate/single-output function/procedure declarations
let double_and_add_us: (x: number, y: number) -> number = {
    x * 2 + y * 2
};

# multi-variate/multi-output function/procedure declarations
let double_us: (x: number, y: number) -> (number, number) = {
    (x * 2, y * 2)
};

# coolest function ever
let unit: (x: number) -> number = x;

# maybe even this (?)
let double_me_and_add_pi: (x: number) -> number = {
  x * 2 + pi
}, where pi: number = 3.14;

# then this should probably also be allowed 🤔
let fancy_idea: number = 2 * pi, where pi: number = 3.14;

# closures, maybe (?)
capture t: (x: number) -> number = x * 2;

# simple struct/record
let pet: struct = .{
    name: string,
    kind: animal_kind,

    #! docstring like this?
    let new: (name: string, kind: animal_kind) -> pet {
        .{ name: name, kind: kind }
        # maybe .{ name, kind } if variable names are identical to field names
    };

    #! for self-referencial instances (maybe?)
    let kind: (self) -> animal_kind {
        self.kind
    }
};

# simple struct/record (alt)
let pet: struct = .{
    pub name: string?,       # optional value (denoted by '?')
    pub kind: animal_kind,
     
    #! docstring like this?
    let new: (name: string, kind: animal_kind) -> pet {
        .{ name: name, kind: kind }
        # maybe .{ name, kind } if variable names are identical to field names
    };
     
    #! for self-referencial instances (maybe?)
    let kind: (self) -> animal_kind {
        self.kind
    }
      
    let name: (self) -> string? {
        self.name
    }
    
    let format: (self) -> string {
        let alt_name: string = {
            let emotion: string = "😞"
            "No name " .. emotion
        };
         
        self.name ! alt_name .. ", " .. self.kind
    }
};

Syntax: (somewhat outdated)

<program> ::= <statement-list>

<statement-list> ::= <statement> | <statement> <statement-list>

<statement> ::= <declaration> ";"

<declaration> ::= <decl-keyword> <identifier> ":" <type> "=" <expression>

<decl-keyword> ::= "let" | "mut"

<type> ::= <basic-type> | <func-type>

<basic-type> ::= "number"

<param-list> ::= <identifier> ":" <type> | <identifier> ":" <type> "," <param-list>

<func-type> ::= "(" <param-list> ")" "->" <type>

<expression> ::= <term> | <expression> "+" <term> | <expression> "-"<term> | <block>

<term> ::= <factor> | <term> "*" <factor> | <term> "/" <factor>

<factor> ::= <number>

<return-value> ::= <expression>

<block> ::= "{" <statement-list> <return-value> "}"

Code generation:

Implemented with a register machine (as opposed to a stack machine).

About

A programming language

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages