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


◀ PREV : [1] : .. [19] : [20] : [21] : [22] : [23] : [24] : [25] : [26] : [27] : .. [96] : NEXT ▶