Start with durable concepts
Work with values, functions, persistent collections, explicit state, and host effects—not a temporary teaching notation.
A small language · a serious runtime
Bring Hara to your terminal with Homebrew, or open the Playground and start experimenting right away. The same small language stays with you as your project grows.
brew install hara-lang/tap/hara Hara is Lisp
The operation comes first. Parentheses hold a computation, vectors hold ordered values, and maps name facts. That small reading model continues from the first expression into a complete program.
Build from first principles
Values, functions, decisions, state, events, rendering, and effects are easier to understand when each one is visible. Hara lets you meet them directly, then compose them into a real application.
Work with values, functions, persistent collections, explicit state, and host effects—not a temporary teaching notation.
Write a form, evaluate it, inspect the value, and change the program without turning every experiment into a rebuild.
Build Tic Tac Toe from a blank canvas, combining data, rules, state, pointer input, rendering, and a live frame loop.
Or watch the parts move first — this Pong rally is one small Hara program, evaluated live by the browser kernel when you press Run.
Build the first game →The language you learn is the language you keep
The host can change without replacing the language or its values. Begin in the browser, then choose Java, native, or web deployment when the program needs it.
Java Run with the Truffle runtime, integrate with Java classes and tools, and target Native Image when a self-contained deployment is useful.
Native hara-rust-full prepares whole-function WebAssembly and hosts it natively for tools, services, local applications, and embedded products.
Web Start with the interpreter core, then load VM, trace, or whole-Wasm compilation capabilities only when the application needs them.
Measured in the open
Hara publishes the code, environment, timing boundaries, raw samples, and expected checksums behind every reference result. The full table remains visible—including the runtimes that are faster.
Arrays, persistent data, recursion, backtracking, branching, range processing, and matrix work share expected results across runtimes.
Startup, preparation, first invocation, warm-up, and steady-state execution are recorded separately where the runtime supports them.
Machine details, toolchain versions, source revisions, commands, raw samples, and checksums are committed alongside the report.
Try the language, not the pitch