"Printf hata ayıklama" özelliğini kullanma
İşlev tanımını değiştirerek Emacs'ın anlamanıza yardımcı olmasına izin verebilirsiniz:
(defun triangle-using-cond (number)
(message (format "called with %d" number))
(cond ((<= number 0) 0)
((= number 1) 1)
((> number 1)
(+ number (triangle-using-cond (1- number))))))
Tampona (message ...)
bir iz yazdırmak için bir yere ekleyin *Messages*
.
Edebug Kullanımı
Noktayı fonksiyon tanımının içinde herhangi bir yere yerleştirin ve C-u C-M-x
"enstrüman" a basın. Daha sonra, örneğin sonradan nokta yerleştirip (triangle-using-cond 3)
vurarak işlevi değerlendirin C-x C-e
.
Şimdi Edebug modundasınız. İşlev boyunca ilerlemek için boşluk çubuğuna basın. Her ifadenin ara değerleri yankı alanında gösterilir. Edebug modundan çıkmak için düğmesine basın q
. Enstrümantasyonu kaldırmak için, tanım içinde herhangi bir noktaya gelin ve tanımı C-M-x
yeniden değerlendirmek için tuşuna basın.
Standart Emacs hata ayıklayıcısını kullanma
M-x debug-on-entry triangle-using-cond
, daha sonra triangle-using-cond
çağrıldığında, Emacs hata ayıklayıcısına (arabellek *Backtrace*
) yerleştirilirsiniz.
Düğmelerini kullanarak değerlendirmede ilerleyin d
(veya c
ilginç olmayan değerlendirmeler arasında geçiş yapın).
Ara durumu (değişken değerler vb.) Görmek için istediğiniz zaman kullanabilirsiniz e
. Değerlendirmek için bir sexp girmeniz istenir ve değerlendirme sonucu yazdırılır.
Hata ayıklayıcıyı kullanırken, kaynak kodun bir kopyasını başka bir çerçevede görünür halde tutun, böylece neler olup bittiğini takip edebilirsiniz.
Ayrıca, kaynak kodundaki rasgele yerlerde hata ayıklayıcıya (az ya da çok kesme noktası) girmek için açık çağrılar ekleyebilirsiniz. Takabilir (debug)
veya (debug nil SOME-SEXP-TO-EVALUATE)
. İkinci durumda, hata ayıklayıcı girildiğinde SOME-SEXP-TO-EVALUATE
değerlendirilir ve sonuç yazdırılır. (Bu kodu kaynak koduna ekleyebileceğinizi ve C-M-x
değerlendirmek için kullanabileceğinizi unutmayın , ardından geri alın - düzenlenen dosyayı kaydetmenize gerek yoktur.)
Daha Using Debugger
fazla bilgi için Elisp kılavuzuna, düğüme bakın.
Döngü olarak özyineleme
Her neyse, özyinelemeyi bir döngü olarak düşünün. Tanımlanmış iki fesih davası vardır: (<= number 0)
ve (= number 1)
. Bu durumlarda işlev basit bir sayı döndürür.
Özyinelemeli durumda, işlev bu sayının toplamını ve ile işlevinin sonucunu döndürür number - 1
. Sonunda, işlev ya 1
sıfırdan küçük ya da ona eşit bir sayı ile çağrılır .
Özyinelemeli vaka sonucu bu nedenle:
(+ number (+ (1- number) (+ (1- (1- number)) ... 1)
Örneğin ele alalım (triangle-using-cond 4)
. Son ifadeyi biriktirelim:
birinci tekrarda number
ise 4
böylece, (> number 1)
şube takip eder. Bir ifade oluşturmaya başlıyoruz (+ 4 ...
ve işlevi (1- 4)
, yani ile çağırıyoruz (triangle-using-cond 3)
.
Şimdi number
ise 3
, ve sonuç (+ 3 (triangle-using-cond 2))
. Toplam sonuç ifadesi (+ 4 (+ 3 (triangle-using-cond 2)))
.
number
olduğu 2
ifade için bunu hemen(+ 4 (+ 3 (+ 2 (triangle-using-cond 1))))
number
olduğu 1
şimdi ve biz almak (= number 1)
bir sıkıcı sonuçlanan dalı 1
. Bütün ifade (+ 4 (+ 3 (+ 2 1)))
. İçten dışa olduğunu değerlendirmek ve elde edersiniz: (+ 4 (+ 3 3))
, (+ 4 6)
, ya da sadece 10
.
triangle-using-cond
ve bağımsız değişken sayı ne olursa olsun 1'den küçük olur. Koşullar a, b ve sonra c sırasına göre ilerler - önce eşleşen her şey, paranın durduğu yerdir.