4 ms·
I would suggest that you look into Common Lisp (no surprise to anyone who knows me …). Why? Well, it’s solid. I spent some years as a professional Python pro
by rauhl 7y ago
I would suggest that you look into Common Lisp (no surprise to anyone who knows me …). Why?
Well, it’s solid. I spent some years as a professional Python programmer, and it was annoying how things which were easy to do in Lisp were difficult or impossible to do in Python (e.g. change a file, reload it and have existing objects updated with the new definitions). Common Lisp offers all the hooks you might want to be able to mutate a system at runtime, but if you don’t want to, then you can just ignore them. I find this very graceful: standardise the possibility, but don’t mandate that one think about stuff one doesn’t need to (yet).
Another aspect of its solidity is how well the standard (ca. 1994) has stood the test of time. There are numerous implementations out there, and they all support the same language (modulo some small bugs, no doubt). Common Lisp code tends to be very portable, and tends to be easy to customise for different implementations and platforms when necessary (the way that FEATURES interacts with conditional reading of source is great). Libraries from twenty years ago still just work. That’s almost unheard of in any other language I’ve used.
Yet another aspect of its solidity is its error-handling capabilities, unmatched in any other language I’ve used. Its condition system offers code the ability to signal exceptional and non-exceptional conditions (specifically, errors, warnings and signals), to catch such conditions, to offer recovery strategies for such conditions and finally to choose between recovery strategies for such conditions — to include prompting for human input if desired. It is an amazingly powerful faculty. But like the ability to handle runtime redefinitions, you don’t need to use it at all if you don’t want to.
It’s high-performance, too, getting within an order of magnitude of the performance of C.
This all means that Common Lisp can be used for quick hacks, simple scripts and all the way up to long-running production systems.
To get started with Common Lisp you’ll want to take a look at Quicklisp, which is the community-standard compilation of free software libraries. It hooks into all the common implementations and offers a plethora of packages.
If you’re willing to use emacs (which I also suggest), then SLIME is very good, but the commercial implementations also have their own excellent IDEs which you might find you prefer.
I’ll be the first to admit that Common Lisp has some flaws, too — I would love to see a modern standard which specifies case-preservation as the default, standardises threads (or something like Go’s channels and goroutines …) and updates the pathname portion of the spec; I’d love to see something which works out a few of the historical bits (like weird argument orders in a few cases). But that stuff is mostly just nitpicking, like complaining that the breaks on a Lamborghini are the wrong colour.