오상우
오상우

Categories

  • lisp
  • scheme
  • sicp

SW 마에스트로 멘토님의 추천으로 SICP 를 공부중이다. 책에서 사용하는 언어는 Scheme이라고 하는 Lisp의 dialect인데, 지금까지 배운 언어들과는 꽤 다르지만 재밌는 언어다.

연습문제 1.5

인자 먼저 계산법과 일반 계산법의 차이를 알아야 풀 수 있는 문제다

(define (p) (p))

(define (test x y)
        (if (= x 0)
            0
            y))

; 아래를 실행하면?
(test 0 (p))

scheme은 인자 먼저 계산법을 사용하기 때문에, 마지막 표현식을 실행하면 0의 값을 evaluation 하고, p를 evaluation 하는데 p는 무한하게 p로 evaluation 되므로 무한 루프에 빠진다.
반면 일반 계산법을 사용하게 되면 프로시저를 먼저 evaluation 하므로 마지막 표현식은 아래와 같이 바뀌고,

(if (= 0 0)
    0
    (p))

첫번째 predicate의 값이 #t이므로 위 식의 값은 0이 되고, 마지막 (p)식은 계산되지 않는다.

연습문제 1.6

마찬가지로 scheme이 인자 먼저 계산법을 사용한다는 것을 알아야 하는 문제다.

; 원래 프로시저
(define (sqrt-iter guess x)
        (if (good-enough? guess x)
            guess
            (sqrt-iter (improve guess x) x)))

; 새 프로시저
(define (new-if predicate then-clause else-clause)
        (cond (predicate then-clause)
              (else else-clause)))

(define (new-sqrt-iter guess x)
        (new-if (good-enough? guess x)
            guess
            (new-sqrt-iter (improve guess x) x)))

원래 프로시저는 scheme의 기본 if 를 사용하여 조건이 충족되면 else 절을 evaluation하지 않고 끝나지만,
새 프로시저는 new-if 라는 새로운 프로시저를 사용하므로 조건 충족 여부와 관계 없이 세 인자를 모두 evaluation 한다. 따라서 else 절을 끝없이 평가하고, new-sqrt-iter 프로시저를 무한하게 재귀적으로 호출하게 된다.