Emacs elisp中的奇怪转义序列回溯

时间:2014-02-21 20:41:08

标签: emacs elisp

当我使用toggle-debug-on-error,并查看 Backtrace 缓冲区中生成的回溯时,有许多关键转义似乎不应该存在,例如:

Debugger entered--Lisp error: (invalid-read-syntax "#")
  read(#<buffer emacs-config.org>)
  eval-defun-2()
  #[257 "\211\203
\303\304!\210\305?!\207   \204\306 \207\307\310!\311\211\306 \262\n\262)=\204+\207" [edebug-all-defs eval-expression-debug-on-error debug-on-error require edebug eval-defun eval-defun-2 make-symbol "t" nil] 6 2405975 "P"](nil)
  ad-Advice-eval-defun(#[257 "\211\203
\303\304!\210\305?!\207   \204\306 \207\307\310!\311\211\306 \262\n\262)=\204+\207" [edebug-all-defs eval-expression-debug-on-error debug-on-error require edebug eval-defun eval-defun-2 make-symbol "t" nil] 6 2405975 "P"] nil)

这是什么,如何将其删除或将其转换为有用的东西?

2 个答案:

答案 0 :(得分:1)

这是字节编译的代码。请参见elisp-manual“16.2字节编译功能”一节。

实际问题是您尝试读取eval文件(可能是每load-file)。这不起作用。 您可以在org-mode中对缓冲区执行的操作是org-babel-execute-buffer。 该功能的文档是:

org-babel-execute-buffer is an interactive autoloaded compiled Lisp
function in `ob-core.el'.

It is bound to C-c C-v b, C-c C-v C-b.

(org-babel-execute-buffer &optional ARG)

Execute source code blocks in a buffer.
Call `org-babel-execute-src-block' on every source block in
the current buffer.

答案 1 :(得分:0)

以下是一些已编译代码的示例 -

(defun foo (x) "Double a number" (+ x x))

(byte-compile 'foo) =>
#[(x) "\211\\\207" [x] 2 "Double a number"]

ie

#[
  (x)                 ; arguments
  "\211\\\207"        ; byte-code
  [x]                 ; constants
  2                   ; stacksize
  "Double a number"   ; docstring
  ]

此代码可以反汇编 -

(disassemble (byte-compile 'foo)) =>

byte code:
  doc:  double a number
  args: (x)
0       varref    x
1       dup       
2       plus      
3       return    

有关这些编译对象的简要说明,请参阅此页面:Byte-Code Objects

如Drew所提到的那样,在堆栈跟踪中具有更易读的编译函数形式会很好。也许有人在某处做了一些建议。