การใช้ "การดีบัก 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 - สิ่งที่ตรงกันก่อนคือที่เจ้าชู้หยุด