이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
양준모
가입: 2015년 9월 3일 올린 글: 3
|
올려짐: 2015년11월25일 4:51 주제: 과제 6-2 질문입니다 |
|
|
과제를 수정하다가 늦게 발견한 부분인데, 현재 주어진 M0 실행기가
(rec test x =>
ifzero x then 0 else (test x)
)
0
는 제대로 수행하지만, 같은 결과를 내야 하는 다른 모양의 함수
(rec test x =>
(fn y => ifzero x then 0 else y) (test x)
)
0
는 제대로 수행하지 못하고 무한루프에 빠집니다.
이 부분은 의도된 부분인가요? |
|
위로 |
|
|
조상우15
가입: 2015년 9월 7일 올린 글: 27
|
올려짐: 2015년11월25일 11:48 주제: |
|
|
제가 생각하기에 두 함수는 다른 것 같아요..
예를 들어 첫 번째 함수에 0을 application 하면 제대로 0이 나오지만
두 번째 함수에 0 을 적용하면 계속 (test 0) 만 호출돼서 제대로 끝나는 상황이 안 오지 않나요?
의도하신대로 첫 번째 함수랑 두 번째 함수가 같은 결과를 내려면 두 번째 함수코드가
코드: |
(rec test x => (fn y => ifzero x then 0 else y) (x)) 0
|
이 되어야 할 것 같아요..
근데 위와 같이 수정해도
syntax에서 재귀를 제한했기 때문에
첫번째 함수는 0이 아닌 값을 application하면 무한루프에 빠지지만
두번째 함수는
코드: |
(fn y => ifzero x then 0 else y)
|
에서 0이 아닌 경우에 스스로를 호출하는게 아니라 y값을 리턴하기 때문에
두 함수가 같다고 보기 어려울 것 같습니다
조상우15 가 2015년11월26일 0:16에 수정함, 총 1 번 수정됨 |
|
위로 |
|
|
최재승
가입: 2012년 9월 10일 올린 글: 211
|
올려짐: 2015년11월25일 14:17 주제: |
|
|
과제 6 스펙문서에 명시되어 있듯이 mexp는 적극적인 (eager-evaluation) 프로그래밍 언어입니다. 즉, 함수를 적용(application)할 때 인자를 계산하여 바인딩한 다음 함수 몸체를 계산합니다.
따라서 두 번째 코드에서, 실행기는 인자인 "(test x)"를 계산하여 바인딩한 다음 함수 몸체의 ifzero 문을 계산하게 되므로 무한 루프에 빠지는 것이 맞습니다. (두 프로그램은 같은 결과를 내야 한다고 볼 수 없습니다.)
교재 (http://ropas.snu.ac.kr/~kwang/4190.310/11/pl-book-draft.pdf) 의 136-138쪽에 eager evaluation과 lazy evaluation에 대한 내용이 있으므로 참고하시기 바랍니다.
조교 드림 |
|
위로 |
|
|
|