Common Lisp is largely abandonware at this point -- e.g. there's no standard way to open a TCP socket!
Common Lisp is largely abandonware at this point -- e.g. there's no standard way to open a TCP socket!
I switched because I was making command line tools and clojure's startup time is abysmal. Babashka doesn't have all the libraries and GraalVM's native image requires herculean effort to work even a little bit and spits out monstrously huge binaries.
Common Lisp is actually a lot more popular than I thought it was. I think perhaps it doesn't look that way, but it's very strong I assure you. Join us on the lisp Discord!
It is possible to create relatively small binaries out of the box with nearly instant startup time. There's plenty of libraries and a strong community. There's also a great number of implementations.
A lot of the things that are not standardized in the standard have been standardized via implementation agreement and libraries abstracting away different implementation differences, such as cffi and bordeaux-threads. I defy closure to have anything nearly as feature complete for parallelization as parallels, blackbird, and CL-async. Speaking of which, the C FFI story is strong enough with lisp that any major missing library or language feature usually has a wrapping list Library around that feature written in C. While it's not standard, all the major implementations have adopted gray streams and people use flexi streams to open sockets. It's the same kind of du jour standard that Clojure relies on.
The standard is flexible enough to have several different implementations on several different platforms. If I need to interface with jvm languages, I can use armed bear common lisp. If I need just a really strong implementation that works in most situations I can use CCL or sbcl. If I need to integrate heavily with C or C++ code I can use ecl or clasp.
It is clunkier because it takes the view that agreement between programmers is more important than clean syntax. The standard was created to unite the different lisp implementations instead of divide them. I value this view.
- it lacks a robust debugger (where you can step, redefine, continue…)
- it uses the GC of the host VM
- can’t save interpreter images
- is designed to be a hosted language, meaning many implementation details are left to the host VM (JVM or JS)
- type checking
- performance
Also, wouldn’t call CL abandonware, since it’s a standardized language. Abandonware by my definition is all the Python 2 or JS code that you can’t run on a current implementation.
If we end up in petty and unproductive nitpicking like that, then there's no standard way to open a TCP socket in Clojure either. Mostly because Clojure, unlike Common Lisp, does not have a standard to talk of.
* It had reader macros (I know, they're usually not a good idea, but I like the power).
* Didn't use its vector notation for anything else than vectors (e.g. in bindings). Petty, but this hurts my eyes.
* Had CL-like gradual typing, TCO and something more similar to CLOS.