evaluation 관련한 두 개의 개념이 헷갈려서 정리해 둔다.
1. applicative-order evaluation은 "evaluate the argument and the apply" 파라미터를 먼저 계산한 후에 함수 정의를 적용하여 연산해 나가는 것이다.
2. normal-order evaluation은 "full expand & reduce", 즉 함수 정의를 반영하여 끝까지 펼친 후에 계산하는 것이다.
SICP Example 5를 예로 들면,
(define (p) (p))
(define (test x y)
(if (= x 0)
0
y))
다음과 같은 정의를 가진 Scheme 함수가 있는데,
(test 0 (p))
를 실행시킨 경우에 각각의 evaluation을 적용하면 어떻게 돌아가겠느냐...가 문제이다.
답은 다음과 같다.
<applicative-order evaluation를 적용한 경우>
파라미터를 먼저 계산하여야 하기 때문에
(test 0 (p)) 의 파라미터 (p)를 먼저 계산하려고 한다.
(p)에 대한 정의를 적용하여 계산하면 (test 0 (p)) 가 된다.
즉,
(test 0 (p))
--> (test 0 (p))
--> (test 0 (p))
--> (test 0 (p))
....
가 되어 무한 반복에 빠져버린다.
applicative-order evaluation을 적용하는 DrScheme으로 위의 코드를 돌려 보면 무한루프에 빠지는 것을 볼 수 있다.
<normal-order evaluation를 적용한 경우>
우선 함수의 정의에 따라 펼친 후에 계산하게 된다.
따라서,
(test 0 (p))
-->
(if (= 0 0)
0
(p))
이렇게 되며, if의 predicate(여기서는 (= 0 0) 임) 는 evaluation과 상관없이 먼저 계산된다고 문제에서 가정하였으므로, 결과는
0
이 된다.
참고로,
http://nosyu.egloos.com/ 의 글로부터 많은 도움을 받았습니다.
이자리를 빌어 감사 드립니다.
Trackback Address :: http://www.dreamjr.org/tt/trackback/100
