프로그래밍한 프로시저를 실행하는 과정은 기본 프로시저의 경우와 거의 같다.
인자에 맞추어 기본 프로시저를 계산하는 방법은 이미 실행기 속에 정해져있다고 보고, 새로 만들어 쓰는 묶음 프로시저의 맞춤 적용,application은 다음 규칙에 따라 계산할 수 있다.
묶음 프로시저를 인자에 맞춘다는 것은,
프로시저의 몸 속에 있는 모든 formal parameter(인자 이름)을 각각 대응하는 인자 값으로 맞바꾼 다음,
그렇게 얻어낸 식의 값을 구하는 것이다.
(f 5)
(sum-of-squares (+ a 1)(* a 2))
인자 이름(a) ↔︎ 인자 값(5) 교환
sum-of-squares (+ 5 1)( * 5 2))
sum-of-squares 연산자, 피연산자 두 개를 엮은 식이 된다.
sum-of-squares (+ 5 1)( * 5 2))
세 가지 문제가 풀린다.
(squares 6)(squares 10)
같은 원리를 재귀한다!
+ (* 6 6)(*10 10)
(+ 36 100)
;;; 136
이런 process(과정)에 따라 프로시저를 맞추는 방법(procedure application) 맞바꿈 계산법substitution model이라고 한다고 한다.
프로시저를 인자에 맞춘다는게 무슨 뜻인지 주시해보자.
식의 값을 구하는 방법은 연산자와 피연산자를 먼저 계산하고, 연산자 프로시저를 연산할 인자에 맞추는 방법만 있는 것이 아니다.
값이 필요할 때까지 피연산자들을 계산하지 않고 미루어 두는 방법도 있다.
인자 값을 계산하지 않고 식 자체를 parameter(인자 이름)와 맞바꾸어 가다가
마지막에 primitive operator(기본 연산)으로만 이루어진 식, 즉 더 펼치지 못하는 식을 얻을 때 그 식의 값을 구하는 방법이 있다.
;: (f 5)
;: (sum-of-squares (+ 5 1) (* 5 2))
;: (+ (square (+ 5 1)) (square (* 5 2)) )
;: (+ (* (+ 5 1) (+ 5 1)) (* (* 5 2) (* 5 2)))
;: (+ (* 6 6) (* 10 10))
;: (+ 36 100)
;: 136
값은 같지만 계산 프로세스가 다르다.
특히 식을 줄여나가면서 저마다 두번씩 계산되는 부분을 주시해보면, 모두 뜯어본 후 식을 줄여가는 방식임을 알 수 있다.
이와 같이
- normal-order-evaluation : '끝까지 펼친 다음에 줄이는' 계산 방법, 정의한 대로 계산하는 법
지금은 '정의대로'냐 '인자 먼저' 관계 없이 같은 값이 나오지만 나중에 어떤 계산법이냐에 따라 서로 다른 값이 나오는 바르지 않은 값이 나오는 경우도 볼 수 있다.