게시판 인덱스

 
 FAQFAQ   검색검색   멤버리스트멤버리스트   사용자 그룹사용자 그룹   사용자 등록하기사용자 등록하기 
 개인 정보개인 정보   비공개 메시지를 확인하려면 로그인하십시오비공개 메시지를 확인하려면 로그인하십시오   로그인로그인 

과제 6-1 질문입니다. (사실 Ocaml질문입니다.)

 
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2013)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
황호기



가입: 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값이 들어올때만 예외처리해주세요.
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
글 쓰기   답변 달기     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2013) 시간대: GMT + 9 시간(한국)
페이지 11

 
건너뛰기:  
새로운 주제를 올릴 수 없습니다
답글을 올릴 수 없습니다
주제를 수정할 수 없습니다
올린 글을 삭제할 수 없습니다
투표를 할 수 없습니다


Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group
Translated by kss & drssay