Can someone please explain what the specific issues are with using the cl package in elisp? As a new coder in emacs I feel as though I’m making a mistake whenever I reach for the (require ‘cl) option. I have read and understood the byte-compilation issue with the cl package. I have looked at the old arguments and have no wish to revive them. I am also not looking for any generalist comment on whether common-lisp is better than x brand lisp.
What I would like to know is practically how to use common-lisp so that any elisp I write will have a good chance of being accepted by the majority of elisp coders. Specifically, should I avoid using common lisp entirely, or are there some parts of the language that are acceptable to everyone and some parts where a good majority of coders would snigger and scoff at?
Without wishing to limit the breadth of the answer, is this:
(mapcar (lambda(x) (* x x)) '(1 2 3))
much more acceptable than this:
(require 'cl)
(loop for el in '(1 2 3) collect (* el el))
While using a lot of third-party libraries and writing some of my own eLisp code, I never encountered the situation when using CL package resulted in a name conflict. So, I’d be tempted to say that the argument against using CL is nothing but puritanism (in the original sense of the word, not meaning the religious side of things).
But, if you are planning on a very long time support and you want to have some sort of a backup, here’s what I would do (but I’m not doing that myself, because fixing things once they are broken seems to be a better tactic). For the functions in CL package that you are using, create a special file, where you
defaliasall of them to have acl-prefix. So, for example, instead of having a(position ...)you would have(cl-position ...). Theoretically will save you the problem of forward compatibility. However functions don’t get removed instantly, you’ll get a warning ahead of time of them being deprecated, and will have a lot of time to update. Up to you, really.Loop macro in Common Lisp is a controversy all by itself, it is not a typical construct for the language and that’s why, for example, the iterate library exists. It also requires that you learn “the loop mini-language” to use it well, which is sort of a small domain-specific language, and there’s really no requirement that this kind of construct use one. BUT, loop has its strong sides. List processing functions such as
mapcarorreducewill serve you well in more trivial cases, like the one you have in your example, but in the less trivial casesloopis going to be a better and also less verbose way of doing the same thing.