이 문제는 환경 계산법(The Environment Model of Evaluation)으로
make-withdraw 프로시저의 작동하는 것을 그림으로 확인하는 문제입니다.
책의 본문에 비슷한 것이 있으므로 이를 참조하여 그렸습니다.
(그림을 클릭하시면 본 크기의 그림을 볼 수 있습니다.)
먼저 make-withdraw가 global에 정의되어 있으므로 그에 관련한 그림을 그립니다.
그리고 (define W1 (make-withdraw 100))식을 실행시킵니다.
그럼 먼저 인자로 initial-amount가 들어올 것이니 환경을 만듭니다.
그리고 body 안의 lambda식을 실행시켜 새로운 환경을 만든 후 balance를 넣습니다.
이 환경에서 W1이 수행됩니다.
그 후 (W1 50)을 실행시킵니다.
그렇다면 E2 환경에 amount가 붙어 값을 넘깁니다.
그 후에 set! 프로시저로 balance를 수정합니다.
그리고 다시 (define W2 (make-withdraw 100))의 식을 실행시킵니다.
처음에는 책에서 나온 것과의 차이를 잘 몰랐습니다.
하지만 생각해보니 W1은 initial-amount와 balance 모두 가지고 있습니다.
따라서 이 모두를 그림으로 그려야 하는 것입니다.

make-withdraw 프로시저를 조금 변형시켜서 확인하였습니다.
(W1 50)을 실행시키면 balance는 50으로 떨어졌지만 initial-amount는 그대로입니다.
그렇지만 이 둘이 같은 환경에 있는지 다른 환경에 있는지 알 수 없었습니다.
다만, balance를 만들기 위해 lambda식을 실행시켜야하므로
이 둘이 다른 환경에 있지 않을까 추측하였습니다.
참조
해럴드 애빌슨, 김재우 역, <컴퓨터 프로그램의 구조와 해석>, 인사이트, 2007, pp. 317
(define (make-withdraw initial-amount)
(let ((balance initial-amount))
(lambda (amount)
(cond ((number? amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(else (display initial-amount)
(display " ")
(display balance)
(newline))))))
(define W1 (make-withdraw 100))
(W1 'd)
(W1 50)
(W1 'd)
(newline)
(define W2 (make-withdraw 100))
(W2 'd)
- SICP Exercise 연습문제 3.13 (0)2008/03/09
- SICP Exercise 연습문제 3.12 (0)2008/03/09
- SICP Exercise 연습문제 3.11 (0)2008/03/09
- SICP Exercise 연습문제 3.10 (0)2008/03/09
- SICP Exercise 연습문제 3.9 (0)2008/03/08
- SICP Exercise 연습문제 3.8 (2)2008/03/08
- SICP Exercise 연습문제 3.7 (0)2008/03/08
글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.












댓글을 달아 주세요