(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.
Major Section: HONS-AND-MEMOIZATION
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.