Skip to main content

public beta · expect bugs

a language for Sorcery.

Web-native. Fully type-inferred without a single annotation. Values first, multiple dispatch, no function colouring — compiled straight to WebAssembly and native. No interpreter. No JIT. Nothing hiding in the dark.

Run it in the browsernpm i -g @unkindnesses/raven
fn fib(n) { fib(n-1) + fib(n-2) }
fn fib(1) { 1 }
fn fib(0) { 0 }
 
fn fibSequence(n) {
xs = []
for i = range(1, n) {
append(&xs, fib(i))
}
return xs
}
 
show fibSequence(10)
output
awaiting invocation_
01

Types, unasked

Annotations are optional. Unannotated code is inferred anyway — for speed and correctness both. Nothing falls back to an interpreter.

02

Ints are library code

Integers, bytes, even malloc are written in Raven itself. Layout and allocation are yours when you want them.

03

Values first

Compound data is immutable by default. The swap operator keeps mutation's convenience; changes never turn up somewhere you didn't ask.

04

Multiple dispatch

One name, many definitions, selected by matching the arguments — types, values or structure.

05

No coloured functions

No async, no await, no codebase cut in half. Any code can suspend.

06

Incremental throughout

The pipeline rebuilds only what moved: fast builds, live REPL, notebooks, tooling that keeps pace.

wasm
The browser, sandboxed by default. Safe enough to run code an LLM wrote.
native
Serverless functions and CLI tools, compiled ahead of time.
js
Reach the DOM or npm with no glue code, and export Raven functions back out.
$ npm i -g @unkindnesses/raven
$ raven
> 2+2
4
> Complex(1, 2) / 2
0.5 + 1.0im
> factorial(big(50))
big(3041409320171337804361260816606476884377641568960512…)