Chris Wellons over at Null Program has another great post. It considers how to define and use structures in Emacs Lisp. What I like most about the post is that it starts with the obvious solution of using a list to hold the structure and accessing the elements of the structure with the
nth function or something similar but notices the problems that such a strategy can bring.
One such problem is that it’s hard to remember which slots in the list corresponds to which items in the structure. This is especially hard on readers but can also trip up the original author. Another issue with using the
nth strategy is that it effectively freezes the slot positions and makes it hard to modify the program.
To solve these problems, Wellons introduces some accessor functions to access the structure items by name. Then he does the same thing for setting the functions by making them settable with
setf. At that point, he’s got a pretty nice solution but has written a lot of boiler plate. He observes that a natural solution is to write a macro to write all the boiler plate and says that Emacs, of course, has already done this with the
Most Elisp programmers have probably used
cl-defstruct but never thought much about why it exists or how it works. That’s what’s great about Wellon’s post: it shows how
cl-defstruct grows naturally out of finding a solution for a common need and the problems that the obvious solution to that need entails.
The rest of Wellon’s post considers changes coming in Emacs 26. If you do any Elisp programming at all, you should definitely read this post. It’s full of good information—way more than I’ve discussed here—and news of what we can expect, as far as structures are concerned, in Emacs 26.