I've been building a personal project in both Clojure and Common Lisp to make a DSL for scraping web data, transforming it, and outputting it to a few backend formats.
I would say it's been significantly harder to achieve the same functionality in CL than Clojure, but there are major perks to the ecosystem. I was surprised by how much I've valued conditions and restarts, type inference from SBCL, stack traces, and tooling in general.
Clojure OTOH feels like it takes much less effort to get up and running, feels more intuitive to write, and has far better documentation.
I'm probably going to continue writing my project in both languages in parallel because I love learning and I spend my time poorly. I want to stick with Clojure given that it sees more use these days, but it's hard not to prefer CL once you invest the time in learning its capabilities.
As a final note, was Practical Common Lisp challenging for anyone else? I've read many glowing recommendations of the book, but at times it feels DENSE, and it took a fair amount of staring at the intermediate stages of the projects to understand what was going on.
I suppose libraries to access the 'net (and WWW specifically) etc. are meant. CL the language is very exhaustively documented, even if much of that documentation is more than 20 years old (and a good share predates Google, so it might not be as accessible).
That was specifically referring to the availability of code examples for the core library on clojuredocs.org (I know hyperspec has some code examples as well, but they haven't been as comprehensive imo) and the ability to seamlessly jump into library source code within Emacs.
I read PCL about seven or eight years ago when I didn't have a lot of experience with programming. It's somewhat dense and some of the topics/chapters may not be absolutely necessary for a beginner to write Lisp programs. But in retrospect, I sometimes find it good reference when I want to brush up certain topics, like CLOS and macro stuffs.
I'm curious in the ways that clojure is faster to get going and more intuitive. Sbcl and quicklisp seem like they are a bit more straight forward/stable than figuring out how to do a jvm nowadays.
Some examples of things that make Clojure click quickly are being able to use seq operations on all core data structures instead of learning how to work with list, vectors, hash tables, and sets separately, documentation being great with tons of code examples on clojuredocs.org, and the fact that you know you need to "do everything the functional way" up front means less decision making. And prolific overuse of hash tables speeds things up too :)
I'd expect you could make the same heavy use of hashtables in either, though I suspect it isn't obvious to lean on setf so much if new to CL? That, or if you are insisting on immutable structures?
I confess I assumed that alists are probably more competitive in speed for many collections than makes sense.
Well, for my project I am using CLOS in CL where I used hash tables in Clojure. But yeah, if I went for hash tables, it would be getfs and setfs to mutate the table, or I saw there are immutable operations for hash tables in CL as well. It just takes a little more code and cognitive load to work with.
Love Common Lisp and found this helpful even after using it for several years (coincidentally I was just reading it before it popped up here again). I'm intrigued by Sly, as a long time Slime user, will have to try it out!
I was also just getting some of my environment set up on Guix and the addition of Guix Shell [0] is great. Now I can set up an environment and load a lisp file instantly (after the initial caching) with `guix shell sbcl [sbcl-packages] -- sbcl --load somefile.lisp [arguments]` Works across computers with Guix for reproducible environments, very nice stuff. Even easier from a blank slate than getting Roswell and/or quicklisp set up, just a one liner with Guix.
Pretty sure that's not true since you can't define recursive types. For example, the following is invalid (in fact there is no way in the CL type system to define a type that represents a proper list of a given element type without using SATISFIES):
Yeah, absolutely. I think CL the language should be modernised (more coherent stdlib, naming scheme for destructive functions, etc) but it's basically the only language that offers a handful of really cool features that I can't get anywhere else.
I would say it's been significantly harder to achieve the same functionality in CL than Clojure, but there are major perks to the ecosystem. I was surprised by how much I've valued conditions and restarts, type inference from SBCL, stack traces, and tooling in general.
Clojure OTOH feels like it takes much less effort to get up and running, feels more intuitive to write, and has far better documentation.
I'm probably going to continue writing my project in both languages in parallel because I love learning and I spend my time poorly. I want to stick with Clojure given that it sees more use these days, but it's hard not to prefer CL once you invest the time in learning its capabilities.
As a final note, was Practical Common Lisp challenging for anyone else? I've read many glowing recommendations of the book, but at times it feels DENSE, and it took a fair amount of staring at the intermediate stages of the projects to understand what was going on.