"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 모드입니다. 스페이스 바를 눌러 기능을 단계별로 실행하십시오. 각 표현식의 중간 값이 에코 영역에 표시됩니다. 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)
. 이 경우 함수는 간단한 숫자를 반환합니다.
재귀 적 경우 함수는 해당 숫자와 함수 결과의 합을로 반환합니다 number - 1
. 결국 함수는 1
0보다 작거나 같은 숫자 로 호출 됩니다.
재귀 사례 결과는 다음과 같습니다.
(+ 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보다 크면 숫자가 무엇이든 1보다 작은 인수로 함수 가 반환 한 값에 숫자를 추가하십시오 . 조건은 a, b 및 c의 순서로 진행됩니다. 먼저 일치하는 것은 벅이 멈추는 곳입니다.