Skip to content

Getting Started ​

Project Links: GitHub · Playground

System Requirements ​

  • OS: Windows, macOS, Linux
  • Rust: 1.70+ (for building from source)
  • Memory: Minimum 256MB

Installation ​

Option 1: Install from crates.io ​

bash
cargo install mailang-cli

Option 2: Build from source ​

bash
git clone https://github.com/Maicarons/mailang.git
cd mailang
cargo build --release

The binary will be at target/release/mailang.

Option 3: Download pre-built binary ​

Download from GitHub Releases.

Verify Installation ​

bash
mailang --version
# Output: mailang <version>

Hello World ​

Create hello.mai:

// This is MaìLang's Hello World
println("Hello, MaìLang! 🌍")

Run:

bash
mailang run hello.mai
# Output: Hello, MaìLang! 🌍

CLI commands ​

CommandDescription
mailangStart REPL
mailang run file.maiRun a source file
mailang run file.mailangbcRun compiled bytecode
mailang eval '1+2'Evaluate inline code
mailang build file.maiCompile to .mailangbc
mailang fmt file.maiFormat sources (--check to lint only)
mailang depsResolve mailang.toml path dependencies
mailang publish / install / search / yank / registryFilesystem / static-HTTP package registry
mailang lspStart the language server

REPL ​

REPL (Read-Eval-Print Loop) is the best way to learn and debug:

bash
mailang
MaìLang REPL 
Type 'exit' or 'quit' to exit.
> 1 + 2
3
> let name = "MaìLang"
> println("Hello, {name}!")
Hello, MaìLang!
> exit

Inline Execution ​

Use the eval subcommand to execute code directly:

bash
mailang eval 'println(42 * 2)'
# Output: 84

Basic Syntax ​

Variables ​

let x = 42              // immutable
var y = 100             // mutable
const PI = 3.14159      // constant
let name: str = "MaìLang" // explicit type

Functions ​

fn add(a: int, b: int) -> int {
    return a + b
}

fn greet(name: str) -> str {
    return "Hello, {name}!"
}

Control Flow ​

if x > 10 {
    println("Greater than 10")
} elif x > 5 {
    println("Greater than 5")
} else {
    println("Less than or equal to 5")
}

for i in 0..10 {
    println(i)
}

OOP ​

class Animal {
    let name: str
    
    fn init(name: str) {
        this.name = name
    }
    
    fn speak() -> str {
        return "{this.name} speaks"
    }
}

class Dog extends Animal {
    override fn speak() -> str {
        return "{this.name} barks!"
    }
}

let dog = Dog("Rex")
println(dog.speak())  // Rex barks!

Error Handling ​

fn divide(a: float, b: float) -> Result<float, str> {
    if b == 0.0 {
        return Err("Division by zero")
    }
    return Ok(a / b)
}

match divide(10.0, 3.0) {
    Ok(v) => println("Result: {v}"),
    Err(e) => println("Error: {e}")
}

Next Steps ​