게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

질문입니다.

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
박지성



가입: 2008년 9월 5일
올린 글: 21

올리기올려짐: 2008년9월5일 16:56    주제: 질문입니다. 인용과 함께 답변

교재(영문) page 25 에 chap 1.1.7 Exercise 1.6에서

지문데로 code를 작성해서 new-if를 사용하면 프로그램이 결과를 내지 못하는데 그 이유를 잘 모르겠습니다.

1.1.6 Exercise 1.5(page 21) 에서 (define (p) (p))는 (p)를 계속해서 부르기 때문에 loop으로 들어가는 것으로 보이는데 이것도 비슷한 문제로 그런 것인지 궁금합니다.



scheme 뉴비를 구해주세요.
위로
사용자 정보 보기 비밀 메시지 보내기
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년9월5일 17:57    주제: Hint 인용과 함께 답변

예제 1.5
1. p에 무엇이 등록되나

코드:
(define (p) (p))

이 코드를 실행시키면 인자를 받지 않고 p를 돌려 주는 p라는 이름의 함수를 환경에 등록합니다.
코드:
(define p (lambda () (p))

와 같은 뜻이죠.

2. (p)를 실행하면 어떻게 될까
우선 p를 환경에서 찾아서 치환할거에요.
코드:
((lambda () (p))

괄호 안에 있는 모든 expression이 실행이 완료된 상태이므로 이제 함수를 호출하려 하겠죠.
첫 번째 expression이 0개의 인자를 받는 함수라 인자가 없어도(없어야) 함수가 제대로 호출됩니다.
함수를 호출하면 형식인자가 실제인자로 치환된 함수본체가 남습니다.
그런데 이 함수 본체가 첫번째 식과 같은거죠.
이 일이 영원히 (최소한 Dr.Scheme을 종료할 떄 까지) 계속됩니다.

--

예제 1.7
예제 1.7은 일반적인 함수호출과 조건문은 다르게 취급되며, 실행 순서도 다르다 는 것을 보여주는 예제입니다.

1. (expr1 expr2 expr3 expr4.... exprN) 이렇게 생긴 프로그램의 실행순서는 어떨까?
우선 expr1을 실행합니다.
함수인 것을 확인하고 expr2부터 exprN까지를 전부 실행해서 값으로 치환합니다.
그 다음에 expr1이 함수인지 확인하고, 함수의 인자가 N-1개 인지 확인하겠죠.
마지막으로 expr1의 함수에 expr2-exprN을 적용한 결과를 돌려줍니다.

2. 그러면 (if cond then else)의 실행 순서는 어떨까?
우선 if란 이름을 환경에서 찾습니다.
if는 특수한 이름이기 때문에 실행기는 실행 순서를 약간 다르게 하기로 마음먹습니다.
cond를 실행시켜보고 true이면 then만, false이면 else만 실행시키는 거죠
각각의 경우에 선택되지 않는 부분의 코드는 거들떠 보지도 않고 넘어갑니다.

둘의 차이를 숙지하고 다시 생각해보세요.


최원태 가 2008년9월6일 1:41에 수정함, 총 2 번 수정됨
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
정영범



가입: 2005년 9월 5일
올린 글: 167

올리기올려짐: 2008년9월5일 18:00    주제: 인용과 함께 답변

덧붙여, 아래와 같이 lazy_if, sqrt-iter를 만들면 무한 루프에 빠지지 않고 문제없이 동작합니다. 단, 제약 조건은 lazy_if가 받는 2,3번째 인자들은 (인자를 받지 않는 function)이어야 한다는 것입니다.


코드:

(define (average x y)
  (/ (+ x y) 2))

(define (improve guess x)
  (average guess (/ x guess)))

(define (good-enough? guess x)
  (< (abs (- (square guess) x)) 0.001))

(define (sqrt x)
  (sqrt-iter 1.0 x))

(define (lazy_if predicate then-function else-function)
  (cond (predicate (then-function))
   (else (else-function))))

(define (sqrt-iter guess x)
  (lazy_if (good-enough? guess x)
      (lambda () guess)
      (lambda ()
        (sqrt-iter (improve guess x)
         x))))



위 코드가 어째서 동작하는지는 직접 생각해 보시기 바랍니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay