Skip to content
This repository has been archived by the owner on Dec 13, 2021. It is now read-only.
Switch branches/tags

Name already in use

A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
Go to file
Cannot retrieve contributors at this time


License Build status


Arret is pure functional, strongly typed language with Lisp-like syntax. It aims to combine the expressiveness of Lisp with guarantees provided by functional programming. The language design documentation has a high-level summary of the language's design choices.

The Arret compiler and parts of its standard library are written in Rust. The mechanism for calling Rust code from Arret is referred to as the Rust Function Interface or RFI. Documentation for the arret_runtime crate describes the core concepts of the RFI.


Docker REPL Image

There is a public Docker image at that runs the Arret REPL. Whenever cargo run repl appears in the documentation this command can be used instead:

> docker run -ti

It can also evaluate single file programs:

> cat hello-world.arret
(import [stdlib base])
(defn main! ()
  (println! "Hello, world!"))

> docker run -i eval - < hello-world.arret
Hello, world!

Build Requirements

  1. A Unix-like host running on ARM64, x86-64 or x86-32. These are the platforms supporting lazy compilation with LLVM's ORC JIT.
  2. LLVM 10 or 11
  3. Rust

Building with rustup and Cargo

> curl -sSf | sh
> cd ~/path/to/repo/root
> cargo run repl



The REPL provides an interactive environment for exploring Arret. It's supported as a first class environment in Arret; the REPL is just as powerful as the compiler.

> cargo run repl
arret> (length '(1 2 3 4 5))
=> 5
arret> (defn identity #{T} ([x T]) -> T x)
arret> /type identity
=> (All #{T} T -> T)
arret> (identity "Hello, world!")
=> "Hello, world!"
arret> /type (identity [one two three])
=> (Vector 'one 'two 'three)
arret> /quit


Compiled programs have a (main!) function as their entry point:

(import [stdlib base])

(defn main! ()
  (println! "Hello, world!"))

These can be compiled to a static binary by running Arret with the path name:

> cargo run compile hello-world.arret
> ./hello-world
"Hello, world!"


A basic Visual Studio Code extension is bundled in editors/code. This uses the Language Server from the lsp-server crate.

# Install `arret-lsp-server`
cargo install --path lsp-server

# Install the Visual Studio code extension
cd editors/code
yarn vscode:install


The Arret language is still rapidly evolving. This makes it impractical to provide accurate documentation of the language and standard library. However, the test programs in run-pass give examples of working Arret code.