Function indirection refers to the ability for a symbol's function cell to contain another symbol as its value, rather than a function object. In that case, the function cell of the latter symbol is used (which might be yet another symbol, etc...) until a function object is found.
Thus if symbol A points to symbol B in this way, and symbol B points back to symbol A, there is a function indirection loop, and any attempt to call either A or B as a function cannot succeed.
It's very difficult to suggest exactly what you should do without seeing the code in question. You could prevent the loop by explicitly redefining one of the functions involved (as an actual function), but I can't guess at the correct solution without seeing the code.
edit:
Well, I looked at the rtm
package via Melpa, and it contains
(defalias 'def-rtm-authenticated-scalar-method 'def-rtm-authenticated-scalar-method)
which is setting a symbol's function cell to its own symbol! I don't know what that was intended to be, but that's the cause of the problem. Log a bug report with the author, if you're able.
Try the following...
Re-evaluate the initial definition (type C-x C-e
with point after the closing parenthesis)
(def-rtm-macro def-rtm-authenticated-scalar-method
rtm-call-authenticated rtm-get-scalar-from-response)
Comment out the bad code from rtm.el and save the file.
;; (defalias 'def-rtm-authenticated-scalar-method 'def-rtm-authenticated-scalar-method)
and
;; (put 'def-rtm-authenticated-scalar-method 'lisp-indent-function 1)
Byte-compile the file with M-x byte-compile-file
(assuming that's now working again since step 1), or use B
in dired.
edit 2
FYI if I manufacture the same basic error in Emacs 24.5, Emacs does not get stuck in an infinite loop. It detects the problem, reports it, and returns control to me. I certainly don't lose the ability to use M-x
. So there's likely some compounding factor at work here which is making a normally-recoverable error less so.
C-g
. Repeat it a few times, if necessary.ESC ESC ESC
is another way to do pretty much the same thing.M-:
(setq debug-on-error t)
RET
, do you then get a stack trace when the error is triggered?