9

我正在尝试了解如何解释和使用 Lisp 调试器的输出。

我有一个非常简单的 Backtrace 来评估我的函数,但我似乎无法弄清楚如何使用它来找出异常发生在我的函数中的哪个 Lisp 'form' 中。

我很感激任何关于我应该做什么的线索,以找到我的代码中错误的来源。

另外 - 为什么第二帧显示为“没有可用于帧的调试信息”?

我附上了调试器和 repl 的屏幕截图(我还在下面包含了我的函数 - 我知道这是非常错误的 - 但我只是对学习正确使用调试器感兴趣)。另外,我在第一帧上按了“v”以转到源,但这导致了repl下方的错误。(编辑 - 通过下载并将其复制到正确的路径来修复丢失的源代码问题)

替代文字

(可怕的功能 - 请不要发表评论!)

(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)))
4

1 回答 1

4

错误在于,您的源代码>中只有一个>,所以这就是问题所在。

编辑内置 CL 函数非常容易在 SBCL 中进行优化,因此尽管代码中的函数调用是 to CL:<,但实际调用的代码(并显示在调试器中)来自优化的、特定的、SBCL 内部例程. 对于用户定义的函数,这不是一个问题,您将更有可能获得有用的框架。

于 2011-01-09T17:53:55.743 回答