이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
황호기
가입: 2013년 9월 4일 올린 글: 19
|
올려짐: 2013년11월12일 17:12 주제: 과제 6-1 질문입니다. (사실 Ocaml질문입니다.) |
|
|
sm5.ml파일과 sonata.ml파일을 보면 둘 다 loc의 타입이 int*int 임을 알 수 있습니다.
하지만, 다음과 같은 코드를 돌리면 다음과 같은 오류가 나옵니다.
코드 : let rec changeval : Sm5.value -> Sonata.value
= fun value -> match value with
| Sm5.Z(a) -> Sonata.Z(a)
| Sm5.B(b) -> Sonata.B(b)
| Sm5.Unit -> Sonata.Unit
| Sm5.L(l) -> Sonata.L(l)
| Sm5.R(r) -> Sonata.R(r)
오류 : File "hw6_1.ml", line 21, characters 23-26:
This expression has type Sm5.Sm5.loc but is here used with type
Sonata.Sonata.loc = int * int
make: *** [hw6_1.cmo] 오류 2
처음에는 loc의 안쪽을 볼 수가 없어서 그럴 것이라고 생각해서 Sonata.L(l)을 Sonata.L(changeloc l) 로 바꾸고 다음과 같은 코드를 적용해 보았는데, 이번에는 다음 오류가 뜹니다.
코드 : let rec changeloc : Sm5.loc -> Sonata.loc
= fun l -> match l with
| (a,b) -> (a,b)
오류 : File "hw6_1.ml", line 14, characters 3-8:
This pattern matches values of type 'a * 'b
but is here used to match values of type Sm5.Sm5.loc
make: *** [hw6_1.cmo] 오류 2
이것을 보니 그냥 Sm5.loc에 int*int가 없다는 듯이 말하는 것 같습니다. record에 대해서도 같은 문제가 발생합니다.
물론 loc주소나 record 등을 직접 옮길 일은 사실상 없기 때문에 예외처리를 해주면 되긴 하나, 왜 이러한 오류가 뜨는지 도저히 이해할 수가 없어서 질문 드립니다. 그래서 묻고 싶은 것은 다음 2가지입니다.
1. 원래 이렇게 어떤 방식으로든 Sm5.loc의 내부구현을 볼 수 없는 거라 오류가 뜨는 것인가요? 아니면 방법이 있는데 제가 코드를 잘못 짠 것인가요?
2. 만약 제가 코드를 잘못 짠 것이라면, 어떻게 고쳐야 할까요? 힌트라도 주시면 감사하겠습니다. 일단 해당 부분을 지우고, 예외처리를 시키면 잘 작동합니다. |
|
위로 |
|
|
강현수
가입: 2011년 9월 27일 올린 글: 16
|
올려짐: 2013년11월12일 18:42 주제: - |
|
|
음... 11학번 같은 강좌에 동일한 내용의 게시물이 있는 듯 한데
(https://ropas.snu.ac.kr/phpbb/viewtopic.php?t=2997), 글 아래에 보니 조교님의 답변이 있네요. 같은 방식으로 익셉션 처리를 하면 되는지 저도 궁금합니다. |
|
위로 |
|
|
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2013년11월12일 18:47 주제: |
|
|
네 그대로 따르도록 하겠습니다.
인용: | loc 값과 record 값이 어떻게 생겼는지 알 수 없기 때문에,
그런 입력은 들어오지 않는다고 가정하겠습니다.
입력으로 들어온 Sm5 프로그램이 loc이나 record 상수를 push하려 시도하면
코드:
raise (Invalid_argument "rozetta")
예외를 발생시켜주세요.
예를 들어,
코드:
Sm5.PUSH(Sm5.Val(Sm5.L location))
Sm5.PUSH(Sm5.Val(Sm5.R record))
이런 명령들은 입력으로 들어오지 않습니다.
물론 이는 push v::C 의 경우에만 해당됩니다.
push x::C로 이미 환경에 저장되어있던 무언가를 꺼내오는 것에는 해당되지 않습니다. |
|
|
위로 |
|
|
복진욱
가입: 2013년 9월 21일 올린 글: 28
|
올려짐: 2013년11월12일 20:44 주제: |
|
|
그러면 똑같이 obj를 인자를 하는 store에 대해서도 push와 같은 처리를 하면 되나요? |
|
위로 |
|
|
강동옥
가입: 2009년 9월 18일 올린 글: 602
|
올려짐: 2013년11월12일 22:52 주제: |
|
|
Store는 스택에 이미 올라온 것을 다루기 때문에 위 내용과 관계가 없어보입니다. push에 record값이나 loc값이 들어올때만 예외처리해주세요. |
|
위로 |
|
|
|