"प्रिंटफ़ डीबगिंग" का उपयोग करना
आप फ़ंक्शन परिभाषा को संशोधित करके Emacs को समझने में आपकी मदद कर सकते हैं:
(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))))))
बस बफर (message ...)
को मुद्रित करने के लिए कहीं और जोड़ दें *Messages*
।
एडबग का उपयोग करना
फ़ंक्शन परिभाषा के अंदर कहीं भी बिंदु रखें और C-u C-M-x
इसे "इंस्ट्रूमेंट" पर हिट करें। फिर फ़ंक्शन का मूल्यांकन करें, उदाहरण के बाद बिंदु को रखकर (triangle-using-cond 3)
और मार C-x C-e
।
अब आप एडबग मोड में हैं। फ़ंक्शन के माध्यम से कदम रखने के लिए स्पेस बार मारो। प्रत्येक अभिव्यक्ति के मध्यवर्ती मूल्यों को प्रतिध्वनि क्षेत्र में दिखाया गया है। एडबग मोड से बाहर निकलने के लिए बस हिट करें q
। इंस्ट्रूमेंटेशन को हटाने के लिए, परिभाषा के अंदर कहीं भी बिंदु डालें और परिभाषा C-M-x
का पुनर्मूल्यांकन करने के लिए हिट करें।
मानक Emacs डीबगर का उपयोग करना
M-x debug-on-entry triangle-using-cond
, तब, जब triangle-using-cond
आह्वान किया जाता है, तो आपको Emacs डीबगर (बफर *Backtrace*
) में रखा जाता है ।
मूल्यांकन के माध्यम से कदम d
(या c
किसी भी निर्बाध मूल्यांकन के माध्यम से छोड़ने के लिए)।
मध्यवर्ती स्थिति (चर मान, आदि) देखने के लिए आप e
कभी भी उपयोग कर सकते हैं । आपको मूल्यांकन करने के लिए एक सेक्सप दर्ज करने के लिए कहा जाता है, और मूल्यांकन परिणाम मुद्रित होता है।
जब आप डीबगर का उपयोग करते हैं, तो स्रोत कोड की एक प्रतिलिपि किसी अन्य फ़्रेम में दिखाई देती है, इसलिए आप अनुसरण कर सकते हैं कि क्या चल रहा है।
आप स्रोत कोड में मनमाने स्थानों पर डिबगर (अधिक या कम ब्रेकप्वाइंट) दर्ज करने के लिए स्पष्ट कॉल भी सम्मिलित कर सकते हैं। आप डालने (debug)
या (debug nil SOME-SEXP-TO-EVALUATE)
। बाद के मामले में, जब डिबगर दर्ज किया SOME-SEXP-TO-EVALUATE
जाता है, तो मूल्यांकन किया जाता है और परिणाम मुद्रित किया जाता है। (याद रखें कि आप इस तरह के कोड को स्रोत कोड में डाल सकते हैं और इसका C-M-x
मूल्यांकन करने के लिए उपयोग कर सकते हैं, फिर पूर्ववत करें - आपको संपादित फ़ाइल को सहेजने की आवश्यकता नहीं है।)
Using Debugger
अधिक जानकारी के लिए Elisp मैन्युअल, नोड देखें।
एक पाश के रूप में पुनरावृत्ति
वैसे भी, एक लूप के रूप में पुनरावृत्ति के बारे में सोचो। दो समाप्ति के मामलों को परिभाषित किया गया है: (<= number 0)
और (= number 1)
। इन मामलों में फ़ंक्शन एक साधारण संख्या देता है।
पुनरावर्ती मामले में फ़ंक्शन उस संख्या का योग देता है और फ़ंक्शन का परिणाम होता है number - 1
। आखिरकार, फ़ंक्शन को 1
या तो या शून्य के बराबर या उससे छोटी संख्या के साथ बुलाया जाएगा ।
पुनरावर्ती मामला परिणाम इसलिए है:
(+ number (+ (1- number) (+ (1- (1- number)) ... 1)
उदाहरण के लिए लें (triangle-using-cond 4)
। चलो अंतिम अभिव्यक्ति जमा करते हैं:
पहले पुनरावृत्ति में number
है 4
, इसलिए (> number 1)
शाखा का पालन किया जाता है। हम एक अभिव्यक्ति का निर्माण शुरू करते हैं (+ 4 ...
और फ़ंक्शन को कॉल करते हैं (1- 4)
, अर्थात (triangle-using-cond 3)
।
अब number
है 3
, और परिणाम है (+ 3 (triangle-using-cond 2))
। कुल परिणाम अभिव्यक्ति है (+ 4 (+ 3 (triangle-using-cond 2)))
।
number
है 2
, अब तो अभिव्यक्ति है(+ 4 (+ 3 (+ 2 (triangle-using-cond 1))))
number
है 1
अब, और हम ले (= number 1)
शाखा, एक उबाऊ में जिसके परिणामस्वरूप 1
। पूरी अभिव्यक्ति है (+ 4 (+ 3 (+ 2 1)))
। बाहर के अंदर से मूल्यांकन कि और आपको मिलता है: (+ 4 (+ 3 3))
, (+ 4 6)
, या बस 10
।
triangle-using-cond
जो संख्या जो भी है, उससे 1 कम है। परिस्थितियाँ a, b और फिर c के क्रम में जाती हैं - जो भी पहले मैच करता है, वह वह स्थान है जहाँ हिरन रुकता है।