"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-xyeniden 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 cilginç 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-EVALUATEdeğerlendirilir ve sonuç yazdırılır. (Bu kodu kaynak koduna ekleyebileceğinizi ve C-M-xdeğerlendirmek için kullanabileceğinizi unutmayın , ardından geri alın - düzenlenen dosyayı kaydetmenize gerek yoktur.)
Daha Using Debuggerfazla 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 1sı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 numberise 4bö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 numberise 3, ve sonuç (+ 3 (triangle-using-cond 2)). Toplam sonuç ifadesi (+ 4 (+ 3 (triangle-using-cond 2))).
numberolduğu 2ifade için bunu hemen(+ 4 (+ 3 (+ 2 (triangle-using-cond 1))))
numberolduğ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-condve 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.