Open EthanHistory opened 8 years ago
with-handlers를 만나면 body를 실행하기 전에 handler 짝들을 먼저 evaluate 합니다. 여기서는 (temp (set-mcar! a 7)이 먼저 실행되므로 우선 a가 (7,2)로 바뀌고, 이후 실행을 하면서 (mcar a)는 7이 되는 것이죠.
racket에서는 이렇게 하고, 우리 과제에서는 body와 handler의 실행 순서를 다르게 해도 좋습니다.
kim-yoonseung commented 7 days ago (with-handlers ([a b] [c d] ..) body) 를 만나면 body를 실행합니다. 실행 중에 (raise E)를 만나면 앞으로 남은 실행을 모두 취소하고, handler의 앞에서부터 체크하여 (a E) = true 이면 (b E)를 실행하고, (c E)= true 이면 (d E)를 실행하는 식으로 다음 진행을 합니다.
만약 raise를 만나서 실행을 모두 취소할 때, with-handlers가 끝까지 없으면 ocaml에서 UNCAUGHT_EXCEPTION을 raise하면 됩니다.
----> 여기서 말씀하신거랑 좀 다른데 여기서 말씀한 대로 하면 1이 나오거든요? 그러면 결과가 7이아니고 1이라도 답으로 채점해주신다는 것인가용?
(let ((a (mcons 1 2))) (with-handlers (( (let ((temp (set-mcar! a 7 ))) (lambda (x) #t)) (lambda (x) x)) ( (lambda (x y) #t) (lambda (x) x))) (mcar a))) 이 케이스가 raket에서는 답이 7이 나오는데 왜 1이 아니고 7이 나오나요??
(mcar a)를 실행할 때 raise가 없으면 그냥 (mcar a)가 출력되는거 아닌가요??