Common Lisp itself is mature and powerful, but getting a CL program onto someone else's machine remains surprisingly painful.
SBCL core images run 50-100MB uncompressed. Startup times crawl. Users need to install a Lisp implementation, configure Quicklisp, manage ASDF systems.
Smelter 0.2 is a single binary (brew install smelter and you're done) that runs Lisp scripts with sub-50ms startup. No runtime to install, no package manager to configure.
brew tap abacusnoir/smelter && brew install smelter
echo '(format t "Hello from CL~%")' | smt cl eval
The binary ships with batteries: YASON for JSON, Drakma for HTTP, UIOP for filesystem and process operations, plus Smelter's own adapters for common scripting tasks.
The 0.2 release adds native Common Lisp mode alongside the existing Coalton support. Two commands, same binary:
# Common Lisp
smt cl run script.lisp
# Coalton (statically typed)
smt run script.coal
On the binary size: Smelter is 20MB uncompressed, ~9MB with UPX compression. This comes from aggressive use of SBCL's :compression t flag in save-lisp-and-die, plus lazy-loading architecture that defers Coalton compiler initialization until actually needed. CL-only scripts skip that overhead entirely (so, roughly ~22% faster execution in CL mode).
Why this matters
I was inspired by the Babashka model in Clojure, and wanted to have a instant-start binary that treats Lisp as a scripting language first.
Smelter fills this gap. The difference between "install SBCL, clone this repo, load the system, call the entry point" and brew install && smt-cl run script is the difference between a tool for enthusiasts and a tool you can drop into a CI pipeline.
Coalton as the upgrade path
Smelter was initially developed for Coalton (i.e. as a way to similarly do smt run ...), and CL mode makes Smelter useful to the broader Lisp community. You can just use it for Common Lisp, or "move on to" Coalton later.
;; Start with CL
(defun greet (name)
(format nil "Hello, ~A" name))
;; Graduate to Coalton when you want types
(declare greet (String -> String))
(define (greet name)
(lisp String (name)
(cl:format cl:nil "Hello, ~A" name)))
Current status
Smelter 0.2.0 is available now:
brew tap abacusnoir/smelter && brew install smelter- Direct download from GitHub releases
- ~9MB binary (compressed), ~42ms startup
- macOS (arm64, x64) and Linux (x64)
The code is MIT-licensed at github.com/abacusnoir/smelter.