함수를 정의하기만 하면 뭐하겟는가

이 함수를 쓸수 있도록 해야하겠다.


가. 함수는 그냥 틀일뿐

함수는 그냥 틀일뿐이다.

선언할시

((x sum y) def ((2 * x) + y))

이러면 sum이라는 함수는 x, y를 파라미터로 받아서 몸통에다가 넣어서 계산하는것이다.

함수호출을

(5 sum 2)  이렇게 하였다면

x 파라미터의 값으로 5가 들어오고

y 파라미터의 값으로 2가 들어갔다.

그러면 함수몸통을 순회하면서 x에 해당하는 부분에 5를 넣고 y에 해당하는 부분에 2를 넣으면

될까? 하고 생각해보니 문제가 있다.

함수는 일회용이 아닌것이다. 함수테이블에 저장되어있는 함수트리를 바로 값을 바꿔버린다면

그것의 사용은 단 한번에 그칠것이다.

저것 이후에 다시 (3 sum 5) 를 호출하면 어떻게 될까?

x파라미터는 x의 값을 찾지 못하고 (이전 호출에 5로 바꿔버림)
y파라미터는 y의 값을 찾지 못한다 (이전 호출에 2로 바꿈)

그러니까 함수는 그냥 틀일뿐이지

바로 사용하려 해서는 안되는것이다.


나. 복사본 만들기

그렇다면 해결책은 단순하다

복사본을 만들어서 그 복사본에서 파라미터를 입력된 값을 바꿔치기 하면 된다.

여기서 아주 복잡해지는데 

파라미터로 입력된 값들을 기억한다. x 에 어떤값(트리가될수도) y에 어떤값(트리가될수도)

x 파라미터 는 몸통에서 순회하면서 x 루트들을 찾는다.
찾았다면 입력된값과 바꿔치기 한다.

y파라미터에 대해서도 똑같은 과정을 밟는다.

전부 바꿔치기 되었으면

함수의 몸통을 평가한다.

평가된 값을 리턴한다.


실제 구현상은 트리를 복사를 하면서 동시에 파라미터를 찾는 방식인데

다음과 같다.



Posted by 멍충한아싸

댓글을 달아 주세요