I keep flipping between Clojure and CL. I like functional programming, so I really like the workflow of Clojure, but the more-interactive nature of CL is incredibly appealing and I like that it doesn’t put so many constraints on you. I love how you can inspect everything and dig into the core of the language so easily and the interactive debugger is insanely cool.
But I just find it so painful to use, all the functions have strange names, docs are shaky especially for libraries, and I just keep bouncing off. I am going to try Advent of Code in CL this year, but I always get tied up in knots with the data manipulation, especially how you seemingly need to use the loop macro for basically everything since there aren’t that many data structure manipulation methods in the standard library. Hashes are also pretty awkward to work with compared to Java Maps or clojure maps.
Also, I can’t shake the feeling that doing all my data manipulation with linked lists is horribly slow, especially since they aren’t lazily evaluated.
ASDF and the package system is like no other language I’ve ever used, which always ties me in knots, too.
Does anyone have any tips? Is there something I’m missing regarding data manipulation, or is it more a matter of breaking through the pain barrier with practice?
Try dolist, dotimes, and do, before resorting to loop.
I’ve been coding in CL for 33 years, still learning every day, and maintain this codebase:
https://gitlab.common-lisp.net/gendl/gendl
I doubt you’ll find any use of loop in there.
Regarding “linked list” structures and performance — if you feel your application has bottlenecks due to use of list, try confirming that by learning and using your implementation’s profiling tools, then replace with arrays, hash tables, etc where applicable.
Lazily evaluated structures are available in libraries and can be built for CL where needed (e.g. the sequences in above gendl library).
Why, out of interest? Is your issue that loop is too complex?
Thank you, this is very sage and practical advice. One question: what is so good about lisp? Why do you use it? You seem to be using it for industrial applications which I find very interesting
Well, for whatever reason, I’d never really learned loop, then I read Paul Graham’s ANSI Common Lisp where he says “for [reasons] the use of loop cannot be recommended,” and henceforth have used that as an excuse for myself never to learn it up to this day.
“What is so good about lisp” – well first of all I’m not sure exactly what or whom you’re replying to here - I don’t see where my original comment mentioned anything about Lisp being “so good” or whatever kind of straw man you are attempting to assemble here. But since you’ve asked: if you were to press me to justify my choice of Common Lisp for gendl, I would say I first came for the legacy codebases. I happened to know of legacy industrial codebases (still relying on a Gendl-like system from the 1980s) where i felt we could add value. Switching them to an entirely different underlying language infrastructure would not, in my estimation, have added value (at least not within my capabilities). So that’s what brought me in. But then i stayed with CL for:
Ths above items are justifications, but I think what really keeps me working in CL is more the subjective feeling of the whole environment — the interactive redefinition and test cycle, image-based development where you can fire up an image with everything loaded and “ready to go,” built-in debuggers, profilers, macroexpanders, introspectors, editor servers so you can slime into your running server to test, profile, debug, and hotpatch in-place. Stuff like that.
Oh I’m absolutely not setting you up for a strawman. I just like to hear why people use such a niche language, especially for 35 years. People tend to have pretty interesting reasons, I had a great conversation with a guy who built a startup on Clojure once for the same reason.
All of this sounds like an excellent reason to use CL, tbh. The standardization and portability is really impressive. I’ve heard that Franz are extremely solid as a vendor - so you use LispWorks as your runtime?
I think the interesting thing about the CL package ecosystem is that it doesn’t have the ‘move fast break stuff’ mindset of many other languages such as JavaScript. Some libraries like Bordeaux are essentially just finished and require very little work.
But on the other hand it’s really cool to see all these new attempts to modernize the language with new syntax, etc - that you can even do that is a testament to the language, I suppose.