Starting with Common Lisp in 2021

post-thumb

First, you probably want to read A Road to Common Lisp.

Second, I joke a lot and swear even more. If you take offense to anything I say, I promise I didn’t intend for it to be offensive. I wrote about getting started with SBCL using CLPM with VSCode. The article you are about to read explains why I wrote it. I have many opinions of Common Lisp projects. My opinions of projects have nothing to do with the folks that wrote them. There are brilliant people doing amazing work. Nothing I say is meant to take away from that.

Why SBCL?

You can honestly use whatever you want. The nice thing about Common Lisp being a standard is all of the implementations will all run your code pretty much the same. They all have slightly different goals, and each is a little different where the standard is not defined, but you can deal with it when you encounter it. I use SBCL because it’s updated regularly, it’s fast, and it’s easy to deal with. If you’re new to Common Lisp, just start with it. You can change it out later when you have your arms around the whole Common Lisp thing.

Why CLPM?

CLPM has very well-defined goals, with which I agree. It doesn’t force the consumers of your code to use it. It’s written in Common Lisp, so it’s easy to hack on if you feel so inclined.

Why do I like it? CLPM gives me deterministic builds via version pinning in my projects. It allows different projects on my computer to pin different versions of the same library. It has a lockfile! It’s insanely common in the Common Lisp world to share dependencies across projects because everything is so stable blah blah blah. I know it’s gross, but almost everyone is cool with it. I like to have the option to use libraries not represented in Quicklisp beta. It does that too!

Jason, doesn’t Qlot do all the same shit? Yea, it does. Fukamachi-san is a genius. I sponsor him on github just for existing. But Qlot requires Roswell. CLPM does all of this stuff without forcing anything on anyone. If you don’t like it, you only have to deal with a clpmfile and a clpmfile.lock in the home directory of the project. You don’t even have to look at them. If you do, though, they’ll tell you the actual versions of the actual libraries that the code uses. It is honestly the only package manager in the Common Lisp world that behaves like the modern package managers you’re used to in other languages without also forcing you to use Roswell. Eric Timmons has done a fantastic job with it and is brilliant. He is also incredibly responsive and helpful as a library maintainer.

Why asdf-vm

First off, the name is confusing. Common Lisp has ASDF. ASDF and asdf-vm are not the same thing. ASDF is the great orchestrator for Common Lisp. It doesn’t download anything for you, but once you have everything downloaded and in the right place, ASDF will put that shit together. The asdf-vm is a version manager for posix OS’s. I wrote about it here. You don’t need to worry about it if you’re already using Roswell, but if you don’t want to use Roswell, it’s a way to install SBCL.

Why VSCode?

VSCode is the best editor on the planet. You might think it’s emacs, but you’d be wrong, just like every lisper on earth. I used to think it was emacs. I wanted it to be emacs so bad, but then I got old and had a kid. Now my time is precious to me. Emacs is a time vampire. It likes to find me at my most inspired and crush that inspiration with weird periodic performance problems or quirky behavior. Fuck me out a few hours every few weekends and see how long we remain friends. I can always fix it, but my time is too precious to deal with it any longer. Why do you hate stability, emacs? How are you getting your ass handed to you by something written by Microsoft in Typescript, emacs? HOW?!?! The Alive plug-in by Rich Heller is like a gift from God. It uses Swank (the same engine emacs does) under the hood, which allows me to all my lispy goodness in an editor that cares about me. When there are bugs, Rich fixes them. It’s awesome.

Where are the libraries?

Anywhere you want. Do you want to be beholden to quicklisp’s weird-ass monthly schedule? DO IT! Do you want the latest buggy disaster from some rando github repo? DO IT! You probably want to read up on how packages work. Once you grok that, be aware that Common Lisp without CLPM doesn’t have a package manager the way most languages do. ASDF will load everything up for you in the right order, but it has no internet. Quicklisp is kinda ASDF’s missing internet.

You can use environment variables, bespoke config, and custom code to make it do anything you want. I suspect that’s why there isn’t just one solution. Try starting with CLPM and see how it works for you. If you hate it, you can write your own like everyone else seems to do. Quicklisp has everything and works very well. There is also Ultralisp. To my knowledge, both of those handle downloading code for you but don’t do much in the way of version pinning etc. Lots of folks use Qlot for version pinning, project lib isolation, etc. It uses Roswell and the magical Roswell util lib though. If you’re cool with that, then it’s great. If not…

What are some links that you have found helpful?