我用 Common Lisp 开发已经快一年了,这真的开始让我感到不安。我开始使用 CLISP 编写 CL,但后来为了速度我切换到 SBCL。我做了很多相当低级的事情,所以我需要与很多 C 代码交互。我真的很喜欢 CL 的增量开发方面(但是我不使用 Emacs - 我在 Vim 中运行 SLIMV),但我发现自己的开发速度比在 Python、Perl、C 甚至 NASM 中的开发速度要慢。问题的根源在于 SBCL 的错误消息。我曾经被迫搜索近 500 行代码,因为 SBCL 决定给我一个ERROR: Invalid number of arguments on foreign function #< some memory address >
. 没有指定调用什么函数,没有行号,什么都没有。最近,我很高兴得到The loaded code expects an incompatible layout for class SB-PRETTY:PRETTY-STREAM.
随机。该代码在 CLISP 上运行良好,但在 SBCL 上出现模糊错误而失败。有什么方法可以使这些消息更具信息性吗?我写 C 和汇编已经快 6 年了,甚至他们会给你一个行号。我见过的唯一合理的 SBCL 错误是阅读器错误,它们几乎没有用,因为它们通常等于缺少括号。同样,是否有任何声明/命令行开关可用于更改此设置?在这一点上,我什至可以编写自己的错误打印机。
编辑:一个例子,(sb-ext:restrict-compiler-policy 'debug 3)
在我的 ~/.sbclrc 中(使用 --load 而不是 --script 所以 .sbclrc 被加载)
debugger invoked on a SB-INT:SIMPLE-PROGRAM-ERROR in thread
#<THREAD "main thread" RUNNING {AB09931}>:
invalid number of arguments: 0
Type HELP for debugger help, or (SB-EXT:EXIT) to exit from SBCL.
restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
#<unavailable argument>
#.(SB-SYS:INT-SAP #XB78CDAE0)
#<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB78CD7DC :TYPE (*
(STRUCT
SB-VM::OS-CONTEXT-T-STRUCT))>
(79))
0] print
(SB-KERNEL::INVALID-ARG-COUNT-ERROR-HANDLER
#<unavailable argument>
#.(SB-SYS:INT-SAP #XB78CDAE0)
#<SB-ALIEN-INTERNALS:ALIEN-VALUE :SAP #XB78CD7DC :TYPE (*
(STRUCT
SB-VM::OS-CONTEXT-T-STRUCT))>
(79))
0] down
(SB-KERNEL:INTERNAL-ERROR
#.(SB-SYS:INT-SAP #XB78CD7DC)
#<unavailable argument>)
1] down
("foreign function: #x805FCBB")
2] down
Bottom of stack.
不完全提供信息。