There's also the issue that using continuation passing (async-io) doesn't auto-magically solve the re-entrancy issues. Consider the following hypothetical command, written using JS-style async/await operators: (async-defun insert-some-parent-dirs () (interactive) (insert (await (locate-dominating-file default-directory "go.mod"))) (insert "\n") (insert (await (locate-dominating-file default-directory "go.work")))) If the user executed such a command multiple times in quick succession, the executions could happen in parallel and would trample over each other. For each use of "await", the programmer has to think about the possibility of other code running "in-between". This style of programming may be harder in Elisp which has a lot of global state in form of buffer contents, markers and overlays.