State of the Common Lisp ecosystem, 2020
I think this article (of sorts) is definitely helpful for onlookers to Common Lisp, but doesn&#x27;t provide the full &quot;story&quot; or &quot;feel&quot; of Common Lisp, and I want to offer to HN my own perspective.<p>Disclaimer #1: I&#x27;ve been working professionally as a Common Lisp programmer---not as a contractor!---for the past decade. I have a vested interest in the language and hiring for it.<p>Disclaimer #2: I am going to ignore commercial implementations of Lisp here, which provide very useful and advanced features, like GUI development, a user-friendly IDE, paid support, etc. [1,2]<p>So let&#x27;s get started. Common Lisp&#x27;s best feature is that it allows you to be insanely productive at the &quot;raw programmer&quot; level. You can write, edit, and debug code very quickly and incrementally, and end up with safe &amp; performant code.<p>There&#x27;s a price to pay: currently the best-in-class experience is still Emacs and SLIME (which come nicely packaged here [3]). As an Emacs fan, that&#x27;s the best news, but to my fellow PyCharm&#x2F;VSCode&#x2F;vim users, it&#x27;s terrible and alienating news. My colleagues who aren&#x27;t Emacs users managed to learn just enough Emacs to be productive in a week, but they still frequently fired up their editor of choice in times of need.<p>It really is worth underscoring that the Emacs+SLIME experience truly fits Common Lisp development like a glove, and the experience, in my opinion, is better than almost every mainstream editor environment out there.<p>Common Lisp&#x27;s worst feature is that it feels like just about everything imaginable has a catch. I don&#x27;t mean &quot;there&#x27;s no free lunch&quot;, I mean that things just plainly don&#x27;t feel <i>cohesive</i> or &quot;100%&quot; most of the time. To name a few examples:<p>1. GUIs: If you want to make a traditional, native GUI using open source solutions, you&#x27;re stuck with really goofy libraries that are non-obvious to get working. As the article points out, you have options. Lisp actually has a renowned framework called CLIM, but I consider the open-source implementation McCLIM [4] currently only principally useful to hobbyists and hackers.<p>2. Deploying applications: Almost every implementation of Lisp has some way to create an executable. But <i>very important</i> aspects that real people care about in production are missing, inconsistent, or poorly documented. For example, almost no open source implementations of Lisp have first-class support for signing binaries on MacOS. Almost no open source implementations have a &quot;tree shaker&quot; to remove unnecessary cruft from the executable. Almost no open source implementations make building a shared library practical.<p>3. Libraries: Many libraries don&#x27;t do even usual things people might want to do. The linear algebra library MAGICL [8], for example, doesn&#x27;t at the time of writing have a way to solve the matrix equation Ax=B. This isn&#x27;t due to laziness of the authors or lack of foresight, but rather that it&#x27;s a library that&#x27;s just not used by enough people to see regular, high-quality contributions as an open-source project. I&#x27;m sure MAGICL solves problems for the authors, but the authors haven&#x27;t taken it upon themselves to make a general, useful, and quasi-complete library for matrix programming in Lisp.<p>These examples are just examples, maybe not even the top examples.<p>There are many things I wish for Common Lisp, but there are two I think I wish most.<p>First, I wish Common Lisp implementations put in work so that they could play nice with other programming languages. Google [11] recently came out with support for protobufs in Lisp, which is nice, but I feel something deeper is needed. I think Common Lisp implementations supporting building C ABI-compatible shared libraries would be an insanely big step forward; it&#x27;d mean that Lisp could feasibly used by every language out there. Right now, the closest we&#x27;ve got is Embeddable Common Lisp, an implementation of Lisp which makes embedding Lisp within C relatively painless, but as usual, it has many catches [12].<p>The way I&#x27;ve coped is to produce stand-alone command-line applications, or to build servers with HTTP APIs. But it feels icky, especially if you&#x27;re working with Python programmers who want to `import` stuff and not run servers just to get some code to work.<p>Second, another thing that I constantly hope for in the Lisp world is for more &quot;hyper productive&quot; programmers to join it, or programmers whose livelihood depends on it. Of course, since Lisp is used by hobbyists, you see tons of hobbyist code. To be sure, a lot of this hobbyist code is perfectly fine. Usually it works, but it&#x27;s just a tad incomplete. However, in my opinion, the worst thing about hobbyist code is that <i>it usually doesn&#x27;t do something useful</i>.<p>What does &quot;useful&quot; even mean? I won&#x27;t claim to be able to define this term in a one-size-fits-all fashion, but &quot;useful&quot; to me is about getting practical computing work done. The further away from being concrete the library is, typically the less useful it is. For example, a typical Lisp programmer will have a penchant for writing a domain-specific language for parsing binary files (cool!), will open-source that code (cool!), but then nobody---including the author of said library---will actually use it to, say, write a parser for GIFs [5]. When somebody <i>does</i> come along to write a GIF parser, they&#x27;re likely not going to use this general binary parsing framework, but hand-roll their own thing.<p>In Lisp, it seems popular to solve meta-problems instead of problems, which is partly due to the fact that Lisp lets you think about problems at very high levels of abstraction using its advanced object system, the meta-object protocol, and macros.<p>(One of my biggest &quot;pet peeve&quot; projects in Lisp, second only to &quot;utility libraries&quot;, are documentation generator libraries. As soon as somebody figures out that documentation strings can actually be programmatically queried in Lisp, they invariably write a baroque &quot;generator&quot; that spits out HTML. I&#x27;ve never, not a single time, ever, used a documentation generator for doing real, paid work. I think one Lisp programmer I know uses it nicely is Nicolas Hafner, aka Shinmera, who uses a documentation generator simply to augment his long-form documentation writing. Staple [9] is one example library of his, where you can see some generated documentation at the bottom.)<p>&quot;Useful&quot; also has to do with how a library is consumed. In the Common Lisp, a library like this [6] is typical. It&#x27;s a bare page (be it on GitHub or otherwise) that provides no examples, no indication of dependencies, etc. Not all libraries are like this, but you run into it frequently enough.<p>The Common Lisp ecosystem lacks a certain &quot;go-getter&quot; philosophy, needed to forge through &quot;boring&quot; work, that some other language ecosystems seem to have. To cherry pick one example, though I don&#x27;t use it, Zig [7] comes out with interesting stuff all the time that&#x27;s genuinely useful. Andrew Kelley, its main developer, is putting tons of hours into getting details around deployment right (e.g., cross-compilation). Little about Common Lisp prevents a motivated person from making equally productive-enhancing strides with the language, but I find that either (a) the interest isn&#x27;t there or (b) the interest is there but the interest is for developing weird, esoteric stuff in Lisp.<p>(My favorite example of a &quot;productive stride&quot; that happened in Lisp is the following. For context, people talk about all the time how difficult it would be to port a Lisp compiler to a new architecture. I myself have clamored for documentation on how to do it with SBCL. But, out of nowhere, some grad student named Charles Zhang came out with a port of SBCL to RISC-V. Not only did he port it, he&#x27;s maintained it with 100s of new commits, making it more performant and less buggy [10].)<p>Common Lisp is an amazing language purely from a practical point-of-view. As I said, to me, it&#x27;s bar-none the best and most productive language to use if you want to &quot;sit down and write code&quot;. The implementations of Lisp, like SBCL, are marvels. Lisp code, once you write it, will work forever (seriously, decades). The #lisp channel on Freenode is nice and helpful, and there are so many amazing people in the community. In Lisp, it&#x27;s seamless to inspect assembly code and work with the world&#x27;s most high-level, meta-object systems all at the same time. But the ecosystem mouthfeel is still off, and Common Lisp would greatly benefit from programmers obsessed with making the language more useful to themselves <i>and others</i> today.<p>[1]: LispWorks: <a href="http:&#x2F;&#x2F;www.lispworks.com&#x2F;" rel="nofollow">http:&#x2F;&#x2F;www.lispworks.com&#x2F;</a><p>[2]: Allegro CL: <a href="https:&#x2F;&#x2F;franz.com&#x2F;products&#x2F;allegro-common-lisp&#x2F;" rel="nofollow">https:&#x2F;&#x2F;franz.com&#x2F;products&#x2F;allegro-common-lisp&#x2F;</a><p>[3]: Portacle: <a href="https:&#x2F;&#x2F;portacle.github.io&#x2F;" rel="nofollow">https:&#x2F;&#x2F;portacle.github.io&#x2F;</a><p>[4]: McCLIM: <a href="https:&#x2F;&#x2F;common-lisp.net&#x2F;project&#x2F;mcclim&#x2F;" rel="nofollow">https:&#x2F;&#x2F;common-lisp.net&#x2F;project&#x2F;mcclim&#x2F;</a><p>[5]: There is a GIF parser though called SKIPPY! <a href="https:&#x2F;&#x2F;www.xach.com&#x2F;lisp&#x2F;skippy&#x2F;" rel="nofollow">https:&#x2F;&#x2F;www.xach.com&#x2F;lisp&#x2F;skippy&#x2F;</a><p>[6]: MIDI: <a href="http:&#x2F;&#x2F;www.doc.gold.ac.uk&#x2F;isms&#x2F;lisp&#x2F;midi&#x2F;" rel="nofollow">http:&#x2F;&#x2F;www.doc.gold.ac.uk&#x2F;isms&#x2F;lisp&#x2F;midi&#x2F;</a><p>[7]: Zig: <a href="https:&#x2F;&#x2F;ziglang.org&#x2F;" rel="nofollow">https:&#x2F;&#x2F;ziglang.org&#x2F;</a><p>[8]: MAGICL: <a href="https:&#x2F;&#x2F;github.com&#x2F;rigetti&#x2F;magicl" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;rigetti&#x2F;magicl</a><p>[9]: Staple: <a href="https:&#x2F;&#x2F;shinmera.github.io&#x2F;staple&#x2F;" rel="nofollow">https:&#x2F;&#x2F;shinmera.github.io&#x2F;staple&#x2F;</a><p>[10]: Charles Zhang&#x27;s SBCL commits <a href="https:&#x2F;&#x2F;github.com&#x2F;sbcl&#x2F;sbcl&#x2F;commits?author=karlosz" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;sbcl&#x2F;sbcl&#x2F;commits?author=karlosz</a><p>[11]: CL-PROTOBUFS: <a href="https:&#x2F;&#x2F;github.com&#x2F;qitab&#x2F;cl-protobufs" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;qitab&#x2F;cl-protobufs</a><p>[12]: Poorly documented, performance isn&#x27;t very good, it&#x27;s maintained by essentially one person, the rituals needed to use ECL-built libraries are more extensive than necessary, build times are insanely slow, ...