ݺߣ

ݺߣShare a Scribd company logo
3.2 환경 계산법
맞바꿈 계산법(substitution model of evaluation)
• 인자를 받아서 프로시저의 값을 구하려면,
그 프로시저의 몸에서 각 인자 이름을 건네 받은 인자 값으로 모두 맞바꾸어 계산한다.
계산 과정
(f 5)
(sum-of-squares (+ a 1) (* a 2))
(sum-of-squares (+ 5 1) (* 5 2))
(+ (square 6) (square 10))
(+ (* 6 6) (* 10 10))
(+ 36 100)
(define (square x)
(* x x))
(define (sum-of-squares x y)
(+ (square x) (square y)))
(define (f a)
(sum-of-squares (+ a 1) (* a 2)))
But
프로그래밍 언어에 변수 값을 덮어쓰는 연산(set! 같은)이 들어가면,
이런 뜻풀이는 들어맞지 않는다.
변수는 그저 값을 가리키는 이름이라고 보는 대신에
값을 넣어 놓는 ‘자리'이름으로 보아야 한다.
환경 계산법에서 나오는 여러 가지 용어들
• 변수 일람표
• 프로시저 물체
• 프로시저 물체의 꼬리
(pointer)
• 둘러싸는 환경
• 맨 바깥쪽(global) 환경
• 문맥(context)
계산 규칙
• 새 프로시저 만들기
(define square
(lambda (x) (* x x)))
• 변수 일람표
• 프로시저 물체
• 프로시저 물체의 꼬리(pointer)
• 둘러싸는 환경
• 맨 바깥쪽(global) 환경
• 문맥(context)
계산 규칙
• 프로시저 적용
(square 5)
1. 먼저 새 환경(새 변수 일람표)을 만든다
2. 건네 받은 인자를 정의
(5와 square)
1. 새 환경에서 프로시저의 몸을 계산
이제 환경 계산법을 써서
set!이 어떻게 돌아가는지 알아보자
앞에서 했던 ‘돈 꺼내는 물체’를
환경 계산법으로 ѫ보자
set!이 어떻게 돌아갈까
(define (make-withdraw balance)
(lambda (amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds")))
set!이 어떻게 돌아갈까
• 여기에 프로시저 물체를 하나 더 추가
(define W1 (make-withdraw 100))
set!이 어떻게 돌아갈까
• 이제 (W1 50) 을 계산한다
새 일람표를 둘러싸는 환경이 맨 바깥쪽 환경이 아니라 E1이다!!
(W1 프로시저 물체의 꼬리가 환경 E1을 가리키기 때문!!)
환경ѫ법
만약 W2를 추가해준다면?
• (define W2 (make-withdraw 100))
안쪽 정의를
환경 계산법으로 ѫ보자
안쪽 정의
(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess)
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))
안쪽 정의
(define (sqrt x)
(define (good-enough? guess)
(< (abs (- (square guess) x)) 0.001))
(define (improve guess)
(average guess (/ x guess)))
(define (sqrt-iter guess)
(if (good-enough? guess)
guess
(sqrt-iter (improve guess))))
(sqrt-iter 1.0))
끝 !

More Related Content

환경ѫ법

  • 2. 맞바꿈 계산법(substitution model of evaluation) • 인자를 받아서 프로시저의 값을 구하려면, 그 프로시저의 몸에서 각 인자 이름을 건네 받은 인자 값으로 모두 맞바꾸어 계산한다.
  • 3. 계산 과정 (f 5) (sum-of-squares (+ a 1) (* a 2)) (sum-of-squares (+ 5 1) (* 5 2)) (+ (square 6) (square 10)) (+ (* 6 6) (* 10 10)) (+ 36 100) (define (square x) (* x x)) (define (sum-of-squares x y) (+ (square x) (square y))) (define (f a) (sum-of-squares (+ a 1) (* a 2)))
  • 4. But 프로그래밍 언어에 변수 값을 덮어쓰는 연산(set! 같은)이 들어가면, 이런 뜻풀이는 들어맞지 않는다. 변수는 그저 값을 가리키는 이름이라고 보는 대신에 값을 넣어 놓는 ‘자리'이름으로 보아야 한다.
  • 5. 환경 계산법에서 나오는 여러 가지 용어들 • 변수 일람표 • 프로시저 물체 • 프로시저 물체의 꼬리 (pointer) • 둘러싸는 환경 • 맨 바깥쪽(global) 환경 • 문맥(context)
  • 6. 계산 규칙 • 새 프로시저 만들기 (define square (lambda (x) (* x x))) • 변수 일람표 • 프로시저 물체 • 프로시저 물체의 꼬리(pointer) • 둘러싸는 환경 • 맨 바깥쪽(global) 환경 • 문맥(context)
  • 7. 계산 규칙 • 프로시저 적용 (square 5) 1. 먼저 새 환경(새 변수 일람표)을 만든다 2. 건네 받은 인자를 정의 (5와 square) 1. 새 환경에서 프로시저의 몸을 계산
  • 8. 이제 환경 계산법을 써서 set!이 어떻게 돌아가는지 알아보자
  • 9. 앞에서 했던 ‘돈 꺼내는 물체’를 환경 계산법으로 ѫ보자
  • 10. set!이 어떻게 돌아갈까 (define (make-withdraw balance) (lambda (amount) (if (>= balance amount) (begin (set! balance (- balance amount)) balance) "Insufficient funds")))
  • 11. set!이 어떻게 돌아갈까 • 여기에 프로시저 물체를 하나 더 추가 (define W1 (make-withdraw 100))
  • 12. set!이 어떻게 돌아갈까 • 이제 (W1 50) 을 계산한다
  • 13. 새 일람표를 둘러싸는 환경이 맨 바깥쪽 환경이 아니라 E1이다!! (W1 프로시저 물체의 꼬리가 환경 E1을 가리키기 때문!!)
  • 15. 만약 W2를 추가해준다면? • (define W2 (make-withdraw 100))
  • 17. 안쪽 정의 (define (sqrt x) (define (good-enough? guess) (< (abs (- (square guess) x)) 0.001)) (define (improve guess) (average guess (/ x guess))) (define (sqrt-iter guess) (if (good-enough? guess) guess (sqrt-iter (improve guess)))) (sqrt-iter 1.0))
  • 18. 안쪽 정의 (define (sqrt x) (define (good-enough? guess) (< (abs (- (square guess) x)) 0.001)) (define (improve guess) (average guess (/ x guess))) (define (sqrt-iter guess) (if (good-enough? guess) guess (sqrt-iter (improve guess)))) (sqrt-iter 1.0))
  • 19. 끝 !