Write like a dynamic language, get a strict one
Full inference across the whole program. Annotate a signature where it helps someone reading it, never to satisfy the compiler.
Every function tells you what it touches, files, network, failure, and you never annotate one. Full type safety, performance of GraalVM.
Runs in your browser. Nothing to install to try it.
use std::effects::log::{ Console, println }
use std::effects::http::{ HttpClient, MockHttpClient, mock_get, request }
# weather says <Http> in its type. It never says which client answers,
# so the caller below picks that, not weather.
let weather = { url } -> request { url }.send {}.text_or { def = "offline" }
let main = {} -> perform Console in do
let url = "https://wttr.in/Amsterdam?format=3"
# The real client. This one goes over the network.
perform HttpClient in println { msg = weather { url } }
# Same function, same url, no network at all.
let rules = [mock_get { body = "Amsterdam: Always raining", url = "*" }]
perform MockHttpClient { rules } in println { msg = weather { url } }
Full inference across the whole program. Annotate a signature where it helps someone reading it, never to satisfy the compiler.
The same function runs against the real filesystem or an in-memory one, a live clock or a frozen one. Tests get a different handler, not different code.
Millions of virtual threads, spawning a new one is cheap. Software Transactional Memory, Atoms, Channels, Cancellation all built to work together.
Optimised data structures, loop fusion, and safe mutation effect. AOT native binaries when you want them.
Async, exceptions, and early return are ordinary functions here, not syntax language had to grow. Write your own control flow and it looks like everyone else's.
Records at core, arguments are just records, so every call names its fields. Effects are records of functions and so are Abilities. Learn record, variant, effect, ability, and you have the language covered.
Mezze runs on GraalVM, so calling the Java, Kotlin, Python, and Javascript code you already have is the plan. Designed, not yet shipped.
Durable workflows and distributed execution, built on the same effect system. Designed, not yet shipped.