9

Lisp デバッガーの出力を解釈し、使用する方法を理解しようとしています。

関数を評価するための非常に単純なバックトレースがありますが、それを使用して、関数内のどの Lisp 'フォーム' で例外が発生したかを調べる方法がわかりません。

コードのどこでエラーが発生したかを見つけるために、何をすべきかについての手がかりをいただければ幸いです。

また、2 番目のフレームに「フレームのデバッグ情報がありません」と表示されるのはなぜですか?

デバッガーのスクリーン ショットと 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

エラーはあり、ソースに>は1つしかない>ので、そこに問題があります。

edit組み込みの CL 関数は SBCL で最適化される傾向が非常に強いため、コード内の関数呼び出しは に対してですがCL:<、実際に呼び出される (デバッガーに表示される) コードは、最適化された特定の SBCL 内部ルーチンからのものです。 . これは、有用なフレームを取得する可能性がはるかに高いユーザー定義関数の問題ではありません。

于 2011-01-09T17:53:55.743 に答える