I've built a command-line REPL called sc, designed to drive Shortcut's API. During that process I built a small, intentionally limited Clojure-like Lisp language as the user interface.

To give you a taste of how limited the Lisp in sc is: It supports global bindings with an impoverished version of def, but it has no let form; you have to use functions to get lexically-scoped bindings.

So I decided to replace this wing-snipped Lisp with a more complete implementation that provides an experience closer to Clojure, and thus was born PiLisp.

PiLisp is interpreted. It is written in Dart. The core language runs on any target that Dart does, with separate projects in the works that take fuller advantage of platform-specific functionality.

I am still in the middle of porting parts of Clojure to PiLisp. As the README warns:

Alpha. Much works, much may change.

Given how far PiLisp has come compared to what is built into sc, as well as how deeply coupled that mini Lisp is to the application requirements of sc, I don't think I'll ever try to refactor sc to use PiLisp instead. But certain design choices I had in mind for the language in sc definitely influenced the direction I've taken PiLisp.

Check out future posts in the PiLisp feed for details about the implementation, design choices, adherence to and departure from Clojure semantics, the experience of building this with Dart, and hopefully some interesting applications.

Tags: mini-language clojure programming-language pilisp dart

Copyright © 2023 Daniel Gregoire