การใช้ "การดีบัก printf"
คุณสามารถให้ 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*บัฟเฟอร์
ใช้ Edebug
วางจุดใดก็ได้ภายในนิยามฟังก์ชั่นแล้วกดC-u C-M-xเพื่อ "เครื่องดนตรี" จากนั้นประเมินผลการทำงานเช่นการวางจุดหลังและกดปุ่ม(triangle-using-cond 3)C-x C-e
ตอนนี้คุณอยู่ในโหมด Edebug กดแป้นเว้นวรรคเพื่อไปยังฟังก์ชัน ค่ากลางของแต่ละนิพจน์จะแสดงในพื้นที่ echo เพื่อออกจากโหมด Edebug qเพียงแค่กด ในการลบเครื่องมือออกวางจุดใดก็ได้ในคำจำกัดความแล้วกดC-M-xเพื่อประเมินความหมายอีกครั้ง
การใช้ดีบักเกอร์ Emacs มาตรฐาน
M-x debug-on-entry triangle-using-condจากนั้นเมื่อtriangle-using-condมีการเรียกใช้คุณจะอยู่ในดีบักเกอร์ Emacs (บัฟเฟอร์*Backtrace*)
ผ่านการประเมินผลโดยใช้d(หรือcเพื่อข้ามการประเมินผลที่ไม่น่าสนใจ)
หากต้องการดูสถานะสื่อกลาง (ค่าตัวแปร ฯลฯ ) คุณสามารถใช้งานได้eทุกเวลา คุณได้รับพร้อมท์ให้ป้อน sexp เพื่อประเมินผลและพิมพ์ผลการประเมิน
ขณะที่คุณใช้ดีบักเกอร์เก็บสำเนาของซอร์สโค้ดไว้ในเฟรมอื่นเพื่อให้คุณสามารถติดตามสิ่งที่เกิดขึ้น
นอกจากนี้คุณยังสามารถแทรกการโทรอย่างชัดเจนเพื่อเข้าสู่ดีบั๊ก (จุดพักมากหรือน้อยกว่า) ที่ตำแหน่งใดก็ได้ในซอร์สโค้ด คุณสามารถแทรกหรือ(debug) (debug nil SOME-SEXP-TO-EVALUATE)ในกรณีหลังเมื่อSOME-SEXP-TO-EVALUATEมีการประเมินการดีบักและพิมพ์ผลลัพธ์ (โปรดจำไว้ว่าคุณสามารถแทรกรหัสดังกล่าวลงในซอร์สโค้ดและใช้C-M-xในการประเมินได้แล้วเลิกทำ - คุณไม่จำเป็นต้องบันทึกไฟล์ที่แก้ไขแล้ว)
ดูคู่มือ Elisp, โหนดUsing Debuggerสำหรับข้อมูลเพิ่มเติม
การเรียกซ้ำเป็นวนซ้ำ
อย่างไรก็ตามคิดว่าการวนซ้ำเป็นวนซ้ำ มีสองกรณีการเลิกจ้างที่กำหนดไว้คือและ(<= number 0) (= number 1)ในกรณีเหล่านี้ฟังก์ชันจะส่งคืนตัวเลขอย่างง่าย
ในกรณี recursive 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 - สิ่งที่ตรงกันก่อนคือที่เจ้าชู้หยุด