Day 2: Roswell: Install libraries/applications
Hi, all Common Lispers.
In the previous article, I introduced the management of Lisp implementations with Roswell.
One of the readers asked me how to install Roswell itself. Sorry, I forgot to mention it. Please look into the official article at GitHub Wiki. Even on Windows, it recently has become possible to install it with a single command. Quite easy.
Today, I'm going to continue with Roswell: the installation of Common Lisp libraries and applications.
Install from Quicklisp dist
Quicklisp is the de-facto library registry. When you install Roswell, the latest versions of SBCL and Quicklisp are automatically set up.
Let's try to see the value of
ql:*quicklisp-home* in REPL to check where Quicklisp is loaded from.
$ ros run
You see that Quicklisp is installed in
To install a Common Lisp project using this Quicklisp, execute
ros install command:
# Install a project from Quicklisp dist
$ ros install <project name>
You probably remember
ros install command is also used to install Lisp implementations. If you specify something other than the name of implementations, Roswell assumes that it's the name of an ASDF project. If the project is available in Quicklisp dist, it will be installed from Quicklisp.
Installed files will be placed under
~/.roswell/lisp/quicklisp/dists/quicklisp/software/ along with its dependencies.
If it's installed from Quicklisp, it may seem to be the same as
ql:quickload. So you would think that this is just a command to be run from the terminal.
In most cases, that's true. However, if the project being installed contains some command-line programs with the directory named
roswell/, Roswell will perform an additional action.
For example, Qlot provides
qlot command. By running
ros install qlot, Roswell installs the executable at
This shows that Roswell can be used as an installer not only for simple projects but also for command-line applications.
I'll explain how to write such a project in another article someday.
Install from GitHub
How about installing a project that is not in Quicklisp? Or, in some cases, the monthly Quicklisp dist is outdated, and you may want to use the newer version.
By specifying GitHub's user name and project name for
ros install, you can install the project from GitHub.
$ ros install <user name>/<project name>
# In the case of Qlot
$ ros install fukamachi/qlot
Projects installed from GitHub will be placed under
To update it, run
# Note that it is not "fukamachi/qlot".
$ ros update qlot
Besides, you can also install a specific version by specifying a tag name or a branch name.
# Install Qlot v0.11.4 (tag name)
$ ros install fukamachi/qlot/0.11.4
# Install the development version (branch name)
$ ros install fukamachi/qlot/develop
How about installing a project that doesn't exist in both Quicklisp and GitHub?
It's also easy. Just place the files under
~/.roswell/local-projects, and run
ros install <project name>.
Let me explain a little about how it works.
This mechanism is based on the local-projects mechanism provided by Quicklisp.
The "~/.roswell/local-projects" directory can be treated just like the local-projects directory of Quicklisp.
As a side note, if you want to treat other directories like local-projects, just add the path to
ros:*local-project-directories*. This is accomplished by adding Roswell-specific functions to
asdf:*system-definition-search-functions*. Check it out if you are interested.
You can place your personal projects there or symbolically link to them to make them loadable.
But, I personally think that this directory should be used with caution.
Caution on the operation of local-projects
Projects placed under the local-projects directory can be loaded immediately after starting the REPL. I suppose many users use it for this convenience.
However, this becomes a problem when developing multiple projects on the same machine. Quicklisp's "local-projects" directory is user-local. Which means all projects will share it. Therefore, even if you think you are loading from Quicklisp, you may be loading a previously installed version from GitHub.
To avoid these dangers, I recommend using Qlot. If you are interested, please look into it.
Anyway, it is better to keep the number of local-projects to a minimum to avoid problems.
If you suspect that an unintended version of the library is loaded, you can check where the library is loaded by executing
(ql:where-is-system :<project name>).
I introduced how to install Common Lisp projects with Roswell.
- From Quicklisp
ros install <project name>
- From GitHub
ros install <user name>/<project name>
ros install <user name>/<project name>/<tag>
ros install <user name>/<project name>/<branch>
- Manual installation
- Place files under
- Place files under