Arret
Overview
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.
Installation
Docker REPL Image
There is a public Docker image at ghcr.io/etaoins/arret-repl
that runs the Arret REPL.
Whenever cargo run repl
appears in the documentation this command can be used instead:
> docker run -ti ghcr.io/etaoins/arret-repl
It can also evaluate single file programs:
> cat hello-world.arret
(import [stdlib base])
(defn main! ()
(println! "Hello, world!"))
> docker run -i ghcr.io/etaoins/arret-repl eval - < hello-world.arret
Hello, world!
Build Requirements
- A Unix-like host running on ARM64, x86-64 or x86-32. These are the platforms supporting lazy compilation with LLVM's ORC JIT.
- LLVM 10 or 11
- Rust
Building with rustup and Cargo
> curl https://sh.rustup.rs -sSf | sh
> cd ~/path/to/repo/root
> cargo run repl
Usage
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)
defined
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
Compiler
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!"
Editors
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
yarn vscode:install
Examples
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.