이 문제는 인자 먼저 계산법(applicative order evaluation)과

정의대로 계산법(normal-order evaluation)의 차이점에 관한 문제입니다.

 

Lisp는 applicative order evaluation을 쓰니 실행을 시켜보았습니다.

03

 

예상대로 무한루프를 돌아 멈추지 않습니다.

따라서 억지로 Stop 버튼을 눌러 멈추게 했습니다.

 

그럼 이제 normal-order evaluation에 대해 알아봐야합니다.

normal-order evaluation을 쓰는 언어로 'Haskell'이 있습니다.

(참조글 : 파이썬을 통해 배우는 프로시저 추상화)

따라서 해당 언어를 설치해서 확인해보았습니다.

 

00

위처럼 소스를 만들었습니다.

'p = p'가 Lisp에서 '(define (p) (p))'와 같은 의미인지 모르겠습니다만,

일단은 맞다고 가정을 하였습니다.

 

01

해당 파일을 컴파일하고 실행시켜보았습니다.

결과로 0이 출력되었습니다.

역시 이것도 예상대로 나왔습니다.

 

applicative order evaluation의 경우

인자로 들어오는 값을 먼저 계산해야하기에

test 프로시저의 인자로 들어온 p를 계산해야합니다.

하지만 p는 p이기에 p가 인자로 들어올 것이고,

그 p를 또다시 계산해야합니다.

이것이 계속 무한정 반복되기에 무한루프를 돕니다.

 

하지만 normal-order evaluation의 경우

프로시저를 먼저 계산하기에

(test 0 (p))를 (if (= 0 0) 0 y)로 식을 바꿉니다.(Lisp식으로 보면...)

if문을 만족시키기에 0이 결과로 나옵니다.

 

일단 이 책만으로 알아낸 정보는 여기까지입니다.

구글 검색을 해보니 lazy evaluation이라는 단어가 같이 보입니다만,

여기에 대해서는 스터디 같이 하는 선배분들에게 의견을 요청해야겠습니다.

예전에 관련글을 하나 적었지만, 그 때도 잘 이해하지 못했습니다.

'complete boolean evaluation, short-circuit boolean evaluation'

 

그리고 이와 관련해서 강의 영상을 찾았으니 살펴봐야겠습니다.

'SICP / Normal Order Evaluation / Part 2.3'

다만 영어의 초압박이 있습니다.OTL....

 

 

참조

Structure and Interpretation of Computer Programs 2/E - Page 28

크리에이티브 커먼즈 라이선스
Creative Commons License
"in OCW" 카테고리의 다른 글

글에 잘못된 점, 다른 점, 부족한 점이 있다면 지적해주세요.
댓글, 트랙백, 메일 모두 고맙습니다.

트랙백 주소 :: http://nosyu.pe.kr/trackback/1167

  1. Subject: SICP 연습문제 1.5

    Tracked from Mindori's Se.. 2008/04/01 18:57  삭제

    scheme은 기본적으로 인자 먼저 계산법을 통하여 프로시저의 값을 출력하는데,이 사실을 이번에 제대로 각인. 시켜주는 문제였다;(define (p) (p))(define (test x y) (if (= x 0) 0 y))(test 0 (p)) 맨 처음엔, 왜 무한루프가 되나 하고 곰곰히 생각했었다-_-... ......

  2. Subject: applicative-order evaluation..

    Tracked from Dreamjr.ORG 2008/10/09 15:03  삭제

    evaluation 관련한 두 개의 개념이 헷갈려서 정리해 둔다. 1. applicative-order evaluation은 "evaluate the argument and the apply" 파라미터를 먼저 계산한 후에 함수 정의를 적용하여 연산해 나가는 것이다. 2. normal-order evaluation은 "full expand & reduce", 즉 함수 정의를 반영하여 끝까지 펼친 후에 계산하...

댓글을 달아 주세요

  1. 넷평 2009/05/24 04:12  댓글주소  수정/삭제  댓글쓰기

    DrScheme에서 Language를 Lazy Scheme으로 선택해서
    normal-order evaluation을 알아볼 수 있습니다.

    Welcome to DrScheme, version 4.1.5 [3m].
    Language: Lazy Scheme; memory limit: 128 megabytes.
    > (define (p) (p))
    > (define (test x y)
    (if (= x 0)
    0
    y))
    > (test 0 (p))
    0

    (좀더 알아보기위해 검색하다가 여기까지 오게됬네요 ~_~;;)
    (둘러볼게 많군요 +_+;;; 감사히 둘러보겠습니다.)

    • NoSyu 2009/05/24 23:21  댓글주소  수정/삭제

      반갑습니다.
      Lazy Scheme로도 가능하군요.
      저 때는 그 기능을 몰랐던지라 인터넷 문서에 나오는 Haskell로 확인하였습니다.^^
      이번에 기회가 되면 저 언어를 배워보고자 했는데 충분히 가능하군요.
      좋은 정보 고맙습니다.ㅜ

[로그인][오픈아이디란?]