high-level, safe, and simple programming language
Go to file
2023-07-12 16:11:04 -04:00
.github/workflows . 2023-06-26 17:53:27 -04:00
build_scripts changed regex builtin and added binaries to git repo 2023-06-29 15:16:31 -04:00
docs changed regex builtin and added binaries to git repo 2023-06-29 15:16:31 -04:00
examples changed regex builtin and added binaries to git repo 2023-06-29 15:16:31 -04:00
mers changed regex builtin and added binaries to git repo 2023-06-29 15:16:31 -04:00
mers_libs changed VData system again, renamed src/script to src/lang and added src/c.mers, which is an example something that currently does not work properly due to the VData implementation (and serves as a reminder to fix the issue) 2023-05-14 00:11:36 +02:00
.gitignore changed regex builtin and added binaries to git repo 2023-06-29 15:16:31 -04:00
README.md remove github.io site due to overlap with readme 2023-07-12 16:11:04 -04:00

mers build status

Mers is an experimental programming language inspired by high-level and scripting languages, but with error handling inspired by rust.

Why mers?

mers has...

  • the type-safety of statically typed languages
    • mers will not crash unless you exit() with a nonzero exit code or write flawed assumptions using the builtin .assume*() functions (Rust's unwrap or expect)
  • the flexibility of dynamically typed languages
    • x := if condition() { "my string" } else { 12 } // <- this is valid
  • "correctness" (this is subjective and I'll be happy to discuss some of these decisions with people)
    • there is no null / nil
    • all references are explicit: if you pass a list by value, the original list will never be modified in any way.
    • errors are normal values! (no special treatment)
  • a flexible type system to easily represent these errors and any complex structure including recursive types:
    • nothing: [] (an empty tuple)
    • a string: string
    • two strings: [string string] (a tuple)
    • many strings: [string ...] (a list)
    • Either a string or nothing (Rust's Option<String>): string/[]
    • Either an int or an error: (Rust's Result<isize, String>): int/string (better: int/Err(string))
  • compile-time execution through (explicit) macro syntax: !(mers {<code>}) or !(mers "file")

How mers?

Mers is written in rust. If you have cargo, use the build script in build_scripts/ to produce the executable.

Now, create a new text file (or choose one from the examples) and run it: mers <file>.

Known Issues (only major ones)

Multithreading

If a function is called from two threads, all local variables of that function are shared. This doesn't affect builtin functions, and since functions usually don't take long to execute, the change of anyone encountering this is low, but it's something to be aware of. It's a simple fix in theory, but a lot of work to implement, which is why the bug isn't fixed yet.

Docs

intro

syntax cheat sheet

builtins

statements