~abcdw/guile-ares-rs

Asyncronous Extensible Reliable Sleek RPC Server for Guile
suitbl: Profile test-case execution
suitbl: Add simple-profile macro
suitbl: Update notes and TODOs

clone

read-only
https://git.sr.ht/~abcdw/guile-ares-rs
read/write
git@git.sr.ht:~abcdw/guile-ares-rs

You can also use your local clone with git send-email.

1. Introduction

Asynchronous Reliable Extensible Sleek RPC Server for Guile. First of all it's a library providing a lot of tools for evaluating and exploring the code, from simple reflection API to interruptible asyncronous evaluation. In addition to that it provides an async RPC server implementation based on nREPL protocol and can be used for programmable interactions with a running guile processes, for implementing REPLs, IDEs, test runners or other tools. It also can be potentially used as a backend or library for LSP server.

builds.sr.ht status

WARNING: It's in early stage of development, the API is a subject to change.

guile-ares-rs was previously known as guile-nrepl (because it started as just nREPL implementation in Guile Scheme). It was renamed to avoid any confusion with network/socket REPL, guile-ares-rs is not a usual REPL, it's actually not a REPL at all, it's an RPC Server, however it's possible to implement REPL-like experience with it (and respective client).

It's intended for use with Arei IDE, but you can use it with other generic nREPL clients.

2. Usage

The are multiple ways to utilize Ares RS, but most straightforward is to spawn a standalone server and connect to it from a client (Emacs Arei for example):

guix shell guile-next guile-ares-rs -- \
guile -c '((@ (ares server) run-nrepl-server))'

Don't forget to add your project source code and other dependencies to load path.

To be able to use G-expression special syntax #~, #$ and #$@ or when using Arei with Guix or other project, which have reader extensions, load reader extension before starting the nrepl server. You can find the explanation here.

guile -c \
"(begin (use-modules (guix gexp)) #;(load gexp reader extension globally) \
((@ (ares server) run-nrepl-server)))"

To learn more on how to setup a proper environment with exact version of Guix and channels available in the load path, take a look at sample-guile-project.

3. Development

It depends, on fibers, and on guile-next (custom textual ports), tests are executed with gider.

Send patches to rde-devel mailing list in format: [PATCH guile-ares-rs 0/3] SUBJECT-HERE.

Send feedback to rde-discuss.

3.1. First Release Roadmap

Arei and Ares 1.0 milestone.

3.2. Open Questions

  • How to work with fibers in nrepl? Maybe C-2 C-c C-e to entered to the clonned session with fibers spawned.
  • Bootstrap from guile network repl? (Send guile-ares-rs implementation to remote network repl server to make it nrepl).
  • Multiple guile languages support.
  • How to bypass continuation barrier in evaluation thread, when using previously stored continuation.
  • Translation level for shrothanded nrepl base operations?
  • Do we need to support meta-commands? (Probably not, it just functions, which can be exported to user or repl module scope).

4. Other REPLs Quirks

One of the reasons this project started is unfortunate missbehave of current REPL soultions in different situation and here is a list of some of them:

5.1. NREPL

5.1.1. Servers

https://github.com/nrepl/nrepl
default clojure implementation.
https://nrepl.org/nrepl/1.0/building_servers.html
some tips.
https://gitlab.com/technomancy/ogion/-/blob/master/main.rkt
very simple Racket nREPL.
https://gitlab.com/technomancy/jeejah
lua nREPL server.
https://github.com/babashka/babashka.nrepl
probably most advanced 3rd party nREPL server implementation, doesn't support interrupts.
https://docs.cider.mx/cider-nrepl/nrepl-api/ops.html#info
extensions of nREPL for CIDER.

5.1.4. Clients

6. FAQ

Q: Can I use guile-ares-rs with an existing network REPL?

A: Theoretically it's possible to upgrade existing REPL to guile-ares-rs, see bootstrap and infect modules (they can be not implemented yet).

7. Acknowledgements

Thanks for inspiration, help, support and motivation to Jos´e Antonio Ortega Ruiz, Nikita Domnitskii, Maxime Devos, Andy Wingo, Bozhidar Batsov, Andrey Listopadov, Dmitrii Bogdanov, David Thompson, Dmitry Polyakov.

Created: 2025-04-21 Mon 04:24

Validate

Do not follow this link