Elisp backtrace buffer乱码问题

我在 macOS 10.12上跑 emacs 25.2。我正跟着 elisp introduction 敲代码。其中一段是故意执行一段错误代码,来学习 backtrace buffer。执行代码如下:

(This is a list)

执行 C-x C-e 后. 弹出了backtrace buffer,但是有很多乱码:

Debugger entered--Lisp error: (void-function This)
  (This is a list)
  eval((This is a list) nil)
  elisp--eval-last-sexp(nil)
  #[257 "\204\303!\207	\303!\n)B\211A	=\204\211A\[email protected]\207" [eval-expression-debug-on-error elisp--eval-last-sexp-fake-value debug-on-error elisp--eval-last-sexp] 4 2273792 "P"](nil)
  ad-Advice-eval-last-sexp(#[257 "\204\303!\207	\303!\n)B\211A	=\204\211A\[email protected]\207" [eval-expression-debug-on-error elisp--eval-last-sexp-fake-value debug-on-error elisp--eval-last-sexp] 4 2273792 "P"] nil)
  apply(ad-Advice-eval-last-sexp #[257 "\204\303!\207	\303!\n)B\211A	=\204\211A\[email protected]\207" [eval-expression-debug-on-error elisp--eval-last-sexp-fake-value debug-on-error elisp--eval-last-sexp] 4 2273792 "P"] nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

不知如何解决呢?谢谢各位大神!

正常 现象,这叫做字节码,Java 的字节码就是学它的。 大部分时候运行的是Emacs Lisp编译以后的字节码,所以 back trace 出来的就是这种样子。

一般主要看得是函数名,不是字节码。当然有经验的人能直接读懂字节码。

一般不看字节吗,除非你不得不看…

因为你自己修改了 C-x C-e (eval-last-sexp) 的定义,出现的“乱码”并不是乱码,是 Advice 所产生的新的函数的 Byte-Code,按 (elisp) Byte-Code Objects 中介绍,一个函数的 Byte-Code 大致长这样:

#[参数编号 BYTE-CODE 常量数组 堆大小 文档 INTERACTIVE]

Elisp 里似乎没怎么解释 BYTE-CODE 的格式,反正我是不知道如何看。总之它不是乱码,只是你我看不明白而已。

另外,我这里没有修改 C-x C-e (eval-last-sexp) 的定义,出来的 Backtrace 是:

Debugger entered--Lisp error: (void-function This)
  (This is a list)
  eval((This is a list) nil)
  elisp--eval-last-sexp(nil)
  eval-last-sexp(nil)
  funcall-interactively(eval-last-sexp nil)
  call-interactively(eval-last-sexp nil nil)
  command-execute(eval-last-sexp)

所以你也可以试试不要去修改它的定义。

谢谢诸位大神!