I am doing Advent of Code this year. I have meant to do it for several years now; however, something always seems to come up. I was originally planning on doing it in Rust, but the facts that common lisp got a version-pinning-non-global-install package manager and vscode support tempt me to do it in common lisp.
Lisp isn’t cool right now. It doesn’t have the safety/speed/memory management of Rust. 31337 H4X0RZ don’t opine on its beauty on hacker news every few days. Common Lisp only recently got a build system that doesn’t share libraries updated once a month across every project on your system by default. It only recently got vscode support. It is a fractured community that, with some notable exceptions, puts out half-baked solutions to things before abandoning them altogether. Sitting down to build a Common Lisp project is often infuriating because the author either hasn’t touched the library in 8 years or has decided to use some bizarro build process that, if you’re not running their exact environment, can’t be reproduced with out tremendous effort. Put that with the fact that there is no definitive way to set up a project, and you have all the parts necessary to build a really nice bike shed factory. All that being said, I am still more attracted to it than I am rust right now. Its roots are elegant.
The people I know that are exceptional at Rust are the types of people who can straight-up think their way through a problem. They don’t need to be in front of a computer to do it. They don’t need to experiment. They can see it in their head and build it. I am not one of those people. I have to fumble through it. I have to get it all over me. I have to squish it through my toes and get it in my hair. I need a system that will let me fuck up very quickly, so I can do it repeatedly. Only once I have done that will I get to a solution, and the first attempt will be bad. It’s not until my third iteration that there is something I would consider actual software. It’s like sculpting rather than engineering. It’s part of why I’m not fond of pair-programming. I don’t appreciate having people watch me flail. Once I have it working, it will keep on working, it’s just going to be ugly on the way.
For someone like me to use rust is very challenging. The language itself does not allow for imprecision as one iterates through a problem. You have to understand what you’re trying to do before you start writing code. It isn’t really how I and lots of other people program. Even though it is beloved by all devs because it speaks to a purity we all want, there aren’t that many people building new things with it. Many of the projects that I hear about are reimplementations of existing solved problems. The discovery happened in a more malleable language. Obviously, that isn’t always the case; however, it is often the case.
Lisp is different. It’s made for discovery. The entire runtime and dev experience is such that you basically spin up a program and iteratively build it without restarting it. You keep poking at the problem with it until the problem yields. The feedback loop is immediate. The errors are caught and handled manually at first and programmatically as the patterns emerge. It’s much more aligned with how my brain works. It has downsides too. It’s a nightmare to get started. Many lisp projects have no tests. You don’t often hear about large teams of folks writing things in lisp. Discipline can help, but discipline is not a real answer when you have customers depending on you. Lisps seem to be for the Santiagos of the world.
Anyway, I am not committing to anything yet. I will set up a zygote rust project and a zygote lisp project and see which one resists me in a way that forces me to build the muscles that I want to build. I’ll let you know how it goes.