Pipe Operator |>
Chain transformations like a functional pipeline. No nested callbacks, no temp variables.
"hello"
|> String.upper()
|> String.trim()
|> print()Static types, fluent composition, and integrated tooling. The same .zolo file runs across the Lua ecosystem, as a native binary, or in WebAssembly.
effect Clock { fn now() -> str }
fn announce(message: str) with Clock -> str {
let time = perform Clock::now()
"{time} · {message}"
}
let line = handle announce("build ready") with {
Clock::now() => "09:42",
}
print(line)09:42 · build ready01 / language
Composition reads top to bottom. Safety stays explicit. The toolchain ships together.
Chain transformations like a functional pipeline. No nested callbacks, no temp variables.
"hello"
|> String.upper()
|> String.trim()
|> print()Optional types T?, optional chaining ?. and null coalesce ?? eliminate NPEs by design.
let city = user?.address?.city ?? "Unknown"
match result {
.Ok(value) => value,
.Err(error) => report(error),
}LSP with autocomplete and hover, DAP debugger, formatter, VS Code extension and REPL — all out-of-the-box with no configuration.
zolo run app.zolo
zolo check app.zolo
zolo test
zolo build --release02 / examples
Small, complete programs you can open, change, and run in the browser.
let name = "Zolo"
print("Hello, {name}!")
print("Version: {1 + 1}.0")Hello, Zolo! Version: 2.0
VMnativeLLVMwasm-aot04 / toolchain
Compiler, editor intelligence, formatter, and debugger follow the same language model.
05 / start
Start in the browser, then take the same source to the CLI when you are ready.