• This repository has been archived on 13/Dec/2021
  • Stars
    star
    206
  • Rank 190,504 (Top 4 %)
  • Language
    Rust
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated almost 3 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Pure functional Lisp implemented in Rust

Arret

License Build status

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

  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 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.