With-stolen-alist
(with-stolen-alist name form) ensures that name is a fast
alist at the start of the execution of form. At the end of execution, it
ensures that name is a fast alist if and only if it was originally. That
is, if name was not a fast alist originally, its hash table link is freed,
and if it was a fast alist originally but its table was modified during the
execution of form, that table is restored. Note that any extended table
created from the original fast alist during form must be manually freed.
Logically, with-stolen-alist just returns form.
Under the hood, we cause alist to become a fast alist before executing
form, and we check the various conditions outlined above before returning
the final value.
Note that with-stolen-alist will cause logically tail-recursive
functions not to execute tail-recursively if its cleanup phase happens after
the tail-recursive call returns.