이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
박지성
가입: 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에 무엇이 등록되나
이 코드를 실행시키면 인자를 받지 않고 p를 돌려 주는 p라는 이름의 함수를 환경에 등록합니다.
코드: | (define p (lambda () (p)) |
와 같은 뜻이죠.
2. (p)를 실행하면 어떻게 될까
우선 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))))
|
위 코드가 어째서 동작하는지는 직접 생각해 보시기 바랍니다. |
|
위로 |
|
|
|