SICP 연습문제 1.6 풀이
new-if is not a special form
SICP 연습문제 1.6 풀이
연습문제 1.6
cond
를 써서 if
를 보통 프로시저처럼 사용할 수 있을까? 이러한 기대를 가지고 new-if
를 아래처럼 만들어보았다.
(define (new-if predicate then-clause else-clause)
cond (predicate then-clause)
(else else-clause))
제곱근 프로그램에서 new-if
를 사용해보았다. 실제로 이 프로시저로 제곱근을 구해보면 어떤 일이 발생할까?
(define (good-enough? guess x)
(< abs (- (square guess) x) 0.001))
(define (improve guess x)
(average guess (/ x guess)))
(define (sqrt-iter guess x)
(new-if (good-enough? guess x)
guess
(sqrt-iter (improve guess x)
x)))
해설
new-if
는 special form이 아니고 함수이기 때문에 new-if
를 적용하기 전에 피연사자들이 모두 연산되어야 한다. 3번째 피연산자인 sqrt-iter
를 연산하려면 또 new-if
를 만나기 때문에 결론은 무한 루프에 빠지게 된다. Special form과 함수간의 연산 방법의 차이를 잘 인지해야 한다.
참고
This post is licensed under CC BY 4.0 by the author.