|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
김성준
가입: 2009년 9월 10일 올린 글: 30
|
올려짐: 2009년10월28일 11:20 주제: hw5 ex1의 뼈대가 이상한 것 같네요 |
|
|
ex1의 뼈대 중에 Sm5를 보면
코드: | let run c =
try
(ignore (eval ([],[],[],c,[])))
with End -> ()
| x -> print_error x |
코드: | let eval (s,m,e,c,k) =
let x = (s, m, e, c, k) in
match x with
(_,_,_,PUSH(Val v)::c,_) -> (V v::s, m, e, c, k)
.... |
이렇게 구현되어 있습니다. eval을 보면 PUSH를 하고 나서 (V v::s, m, e, c, k)을 그냥 return하고 있습니다.
만약 Sm5.run [PUSH (Val (Num 5)); PUT] 을 실행시키면
( (Num 5), [], [], PUT, [] )
을 리턴하고는 실행이 종료되는데요(m, e, k는 비었다는 의미로 []를 사용했습니다). 즉, stack에 Num 5를 push한 뒤에 PUT은 수행하지 않고 종료됩니다.
제 생각에는 '( (Num 5), [], [], PUT, [] )'을 바로 리턴하는 것이 아니라 'eval ( (Num 5), [], [], PUT, [] ) '의 결과를 리턴해야하는 것 같은데요? |
|
위로 |
|
|
허기홍
가입: 2007년 9월 27일 올린 글: 231
|
올려짐: 2009년10월28일 13:43 주제: |
|
|
성준씨 말이 맞습니다.
뼈대를 고쳐 올려놓았습니다.
새로 받기 귀찮으신 분들은
sm5.ml 파일을 이렇게 고치시면 됩니다.
코드: |
let eval (s,m,e,c,k) =
let x = (s, m, e, c, k) in
match x with
(_,_,_,PUSH(Val v)::c,_) -> (V v::s, m, e, c, k)
....
|
이 부분을
코드: |
let rec eval (s,m,e,c,k) =
let x = (s, m, e, c, k) in
eval (
match x with
(_,_,_,PUSH(Val v)::c,_) -> (V v::s, m, e, c, k)
....
)
|
이렇게 바꾸어 주세요.
즉, 한단계 수행후에 다시 eval을 재귀 호출하는 것입니다. |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|