我在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,但这不起作用。 (缓冲区不可用,因此无法打开)。
任何想法?
答案 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)'提示,所以一些经验可以变得更好定制