Post

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.