Did you know that Emacs already supports tail-call optimisation in the bytecode interpreter? https://github.com/emacs-mirror/emacs/blob/92b3528cf3e6d366086e89b9a909f0c81614a064/src/bytecode.c#L662-L666 (me neither!)