如何在LispBox中调试LISP编译器错误?

时间:2012-02-09 03:33:15

标签: emacs lisp common-lisp slime lisp-in-a-box

我在Windows上安装了LispBox,它运行良好。但是我在调​​试代码时遇到了一些麻烦:当我尝试编译代码时它包含一个错误,例如语法错误,错误消息输出(打印在下面)不是很有用。

编译

时遇到严重错误
"d:/Jervis/Documents/Programming/LISP/hw1.lisp"
   [Condition of type SIMPLE-ERROR]
  0: (CCL::%COMPILE-FILE "d:/Jervis/Documents/Programming/LISP/hw1.lisp" "d:/Jervis/Documents/Programming/LISP/hw1.wx64fsl" T NIL T T NIL T :DEFER NIL #<BACKEND WIN64 #x21001C6FCD> :DEFAULT NIL 0)
  1: (COMPILE-FILE #P"d:/Jervis/Documents/Programming/LISP/hw1.lisp" :OUTPUT-FILE #P"d:/Jervis/Documents/Programming/LISP/hw1.wx64fsl" :VERBOSE T :PRINT NIL :LOAD NIL :FEATURES NIL :TARGET :WIN64 :SAVE-LOC..
  2: (SWANK-BACKEND:CALL-WITH-COMPILATION-HOOKS #<CCL:COMPILED-LEXICAL-CLOSURE (:INTERNAL SWANK-BACKEND:SWANK-COMPILE-FILE) #x2100C2730F>)
  3: ((:INTERNAL SWANK:COMPILE-FILE-FOR-EMACS))
  • 有谁知道如何获取导致编译错误的代码的行号?

我已尝试按照打开编译器输入缓冲区的建议here,但这不起作用。 (缓冲区不可用,因此无法打开)。

任何想法?

1 个答案:

答案 0 :(得分:0)

首先澄清:你提到的* Compiler Input *缓冲区与Common Lisp和Slime无关,它是关于Emacs在编译Emacs Lisp时遇到的错误(它的内部lisp,与CL完全不同)。

至于你的问题(确定文件名/行号以缩小问题范围):当我在文件中输入一段破碎的代码时(比如test.lisp):

(defun fact (n)
  (if (= 0 n)
  1
  !(* n (facto (1- n)))))

,然后通过按C-c C-k缓冲区中的test.lisp尝试通过Slime将其发送到CCL,我收到错误和重新启动列表(重启列表下方还有类似于的回溯你有什么)。按0选择重启0,然后按'n'不将损坏的编译文件加载到CCL。带有错误的缓冲区应替换为名为* slime-compilation *的缓冲区,在我的情况下包含:

cd d:/tmp/lispbox-0.7/
2 compiler notes:

test.lisp:2:5:
  warning: Extra arguments in (IF (= 0 N) 1 ! (* N (FACTO (1- N)))) don't match lambda list (CCL::TEST CCL:TRUE &OPTIONAL CCL:FALSE).
  style-warning: Unused lexical variable N

Compilation failed.

,看起来就像你想要的那样。

我手动安装的Linux CL设置不需要选择0重启,并且还有a slime setting以避免'加载fasl文件无论如何(y / n)'提示,所以一些经验可以变得更好定制