2011-01-09 15 views
9

Lisp hata ayıklayıcısının çıktısını nasıl yorumlayacağınızı ve kullanacağınızı anlamaya çalışıyorum.Lisp hata ayıklayıcıyı kullanma yardımı

İşlevimin değerlendirilmesi için oldukça basit bir Backtrace'im var, ancak işlevimin dışında özel Lisp formunun hangi özel durumun oluştuğunu bulmak için nasıl kullanacağımı anlayamıyorum.

Kodumda nerede hata bulunduğunu bulmak için ne yapmam gerektiğine dair ipuçları isterim.

Ayrıca - ikinci çerçeve neden "çerçeve için kullanılabilir hata ayıklama bilgisi" olarak gösteriliyor?

Hata ayıklayıcısını kullanarak bir ekran görüntüsü ekledim ve repl (Ayrıca, aşağıda işlevimi de ekledim - Çok yanlış olduğunu biliyorum - ancak hata ayıklayıcısını doğru şekilde kullanmayı öğrenmek istiyorum). Ek olarak, kaynağa gitmek için ilk karedeki 'v' tuşuna basıyorum, ancak bu, repl'in altındaki hatanın sonucunu verdi.

alt text

- (DÜZENLEME eksik kaynak kodu sorunu doğru yola kopyalayarak & indirerek sabittir) (korkunç fonksiyonu -! Bir yorum lütfen)

(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))) 
+1

"Lisp hata ayıklayıcısı" bulunmadığından bahsedilmelidir. Lisp, geniş bir dil ve uygulama ailesidir. Çoğu uygulamanın farklı hata ayıklayıcıları vardır. Emacs için SLIME benzeri bir IDE, desteklenen Lisp'lerin üzerinde çalışan bir hata ayıklayıcı arabirim ekler. –

+0

En iyi hata ayıklama bilgileri için optimize bayraklarınızı ayarladınız mı? Herşeyi derlemeden önce bunu değiştirmeyi deneyin: (declaim (en iyileştirme (hız 0) (güvenlik 3) (hata ayıklama 3) (boyut 0))) – Beef

+0

@Beef - evet, bunu zaten denedim. – Joel

cevap

4

hata > ile ve kaynağınızda sadece bir tane > var, yani sorunun nerede olduğu.

düzenlemek Dahili CL fonksiyonları kodunuzda işlev çağrısı CL:< için olsa, kod aslında (ayıklayıcısında yukarı gösteren ve) denir ki, SBCL optimizasyon son derece yatkındır optimize dan spesifik, SBCL-dahili rutini. Bu, kullanıcı tanımlı işlevler için, daha kullanışlı bir çerçeve elde etme olasılığınızın daha yüksek olduğu bir sorun değildir.

+2

Neden işlevin gerçekleştiği kaynağa götürmek için hata ayıklayıcıda 'v' kullanamadım? Hata ayıklayıcısını nasıl kullanacağımı öğrenmek istiyorum (hatanın kendisini düzeltmekten çok daha fazlası var). – Joel

+0

@Xach - Daha önce kullanıcı dostu hata ayıklama çıkışı için bu 'agresif optimizasyon' özelliğini devre dışı bırakmanın bir yolu var mı? Derlenmiş kodda maksimum hata ayıklama desteği için zaten ayarlamıştım (sb-ext: restrict-derleyici-policy 'debug 3). – Joel

+0

Hata dahili bir yordamda olduğundan, SBCL'nin kaynağını, SBCL'nin yeniden bulabileceği şekilde yüklemeniz gerekir. Bir kolay yol SBCL oluşturmak ve onu kaynaktan kurmaktır. – Xach