使用Lisp调试器的帮助
我试图理解如何解释和使用Lisp调试器的输出 我有一个非常简单的回溯来评估我的函数,但我似乎不知道如何使用它来找出异常发生在函数中的哪个Lisp“form” 如果有任何关于我应该做什么的线索,我将不胜感激,以便在我的代码中找到错误的来源 另外-为什么第二个帧显示为“没有可用于帧的调试信息” 我附加了一个带有调试器和repl的屏幕截图(我也在下面包含了我的函数-我知道这是非常错误的-但我只是对学习正确使用调试器感兴趣)。此外,我在第一帧中点击了“v”以转到源代码,但这导致了repl下面的错误。(编辑-通过下载并将其复制到正确的路径,修复缺少的源代码问题) (可怕的功能-请不要评论!)使用Lisp调试器的帮助,lisp,common-lisp,sbcl,Lisp,Common Lisp,Sbcl,我试图理解如何解释和使用Lisp调试器的输出 我有一个非常简单的回溯来评估我的函数,但我似乎不知道如何使用它来找出异常发生在函数中的哪个Lisp“form” 如果有任何关于我应该做什么的线索,我将不胜感激,以便在我的代码中找到错误的来源 另外-为什么第二个帧显示为“没有可用于帧的调试信息” 我附加了一个带有调试器和repl的屏幕截图(我也在下面包含了我的函数-我知道这是非常错误的-但我只是对学习正确使用调试器感兴趣)。此外,我在第一帧中点击了“v”以转到源代码,但这导致了repl下面的错误。(编
错误出现在
中,而您的源代码中只有一个
,因此这就是问题所在
edit内置CL函数在SBCL中极易优化,因此尽管代码中的函数调用是
CL:为什么我不能在调试器中使用“v”来找到函数出现的源代码?我真的很想学习如何使用调试器(不仅仅是修复错误本身!)。@Xach——关于您在第一次编辑中提出的观点——是否有办法禁用这种“积极优化”——以获得更用户友好的调试输出?我已经为编译代码中的最大调试支持设置了(sb ext:restrict compiler policy'debug 3)。由于错误在内部例程中,您需要以SBCL可以再次找到它的方式安装SBCL的源代码。一个简单的方法是构建SBCL并从源代码处安装。我不知道是否有办法禁用这种优化。是否有办法告诉我源代码中的错误来源?如果我有很多对>的函数调用,那就很难跟踪了。还有关于第二个帧的回溯为什么说“没有可用于帧的调试信息”的线索吗?应该提到的是,没有“Lisp调试器”。Lisp是一大类语言和实现。大多数实现都有不同的调试器。像SLIME for Emacs这样的IDE为其添加了一个在支持的Lisp上运行的调试器接口。您是否为最大调试信息设置了优化标志?在编译所有内容之前,请尝试在repl中对此进行评估:(declaim(优化(速度0)(安全3)(调试3)(大小0))@Beef-是的,我已经尝试过了。@Joel:我不知道你的操作系统是什么(人们真的应该提供此信息),但Debian有一个名为sbcl source
,这正是为了这个目的-回溯等。您的操作系统可能也有一个。Debian one安装在/usr/share/sbcl source/src
中,这正是调试器要查看的地方。:-)
(defun myquicksort2 (lst)
(if (eql 1 (length lst))
lst
(let ((mid (middle lst)))
(do ((i 0 (+ i 1)))
((>= i mid) (append (myquicksort2 (subseq lst 0 mid))
(myquicksort2 (subseq lst mid (length lst)))))
(if (> (ltval i lst) (nth 100 lst))
(let ((tmp (ltval i lst)))
(setf (nth i lst) (gtval i lst))
(setf (nth (- (- (length lst) i) 1) lst) tmp)))))))
(defun ltval (i lst)
(nth i lst))
(defun gtval (i lst)
(nth (- (- (length lst) i) 1) lst))
(defun middle (lst)
(round (/ (length lst) 2)))