2

我已经在 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))
  • 有谁知道如何获取导致编译错误的代码的行号?

我试图按照这里的建议打开编译器输入缓冲区,但没有奏效。(缓冲区不可用,因此无法打开)。

有任何想法吗?

4

1 回答 1

0

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

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

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

,然后尝试通过按下缓冲区通过 Slime 将其发送到 CCL C-c C-ktest.lisp我收到一个错误和一个重新启动列表(在重新启动列表下方还有一个与您得到的类似的回溯)。按 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 重启,并且还有一个 slime 设置可以避免“无论如何加载 fasl 文件 (y/n)”提示,因此通过一些自定义可以获得更好的体验。

于 2012-02-09T10:27:33.753 回答