These are archived pages, most of them date back to 2007-2012. This content might not be relevant or accurate anymore.

Standalone Common Lisp executables

Let’s say we have code like this:

(defpackage :app
  (:use :cl)
  (:export :main))

(in-package :app)

(defun main ()


This is supposed to work like this:

cl-launch --lisp sbcl --system app --dump app-image
cl-launch --image app-image --init '(app:main)' -o app

using the same system definition listed below.

You can use various CL implementations.


In SBCL it’s something like:

(require 'asdf)
(asdf:operate 'asdf:load-op :app)
(sb-ext:save-lisp-and-die "program" :executable t :toplevel 'app:main)

with usage of app.asd:

(defsystem :app
  :name "app"
  :components ((:file "app")))

The output is rather big in the time of writing, gzexe may compress it but startup will take a little longer.


In ECL it’s done along the lines of:

(compile-file "program.lisp" :system-p t)
(c:build-program "program" :lisp-files '("program.o")
                           :epilogue-code '(ext:quit (app:main)))

Epilogue code starts the main and quits with return code instead of starting REPL. Program is really small but it depends on libecl shared library.

disorder's homepage