|
|
이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
구본영
가입: 2010년 9월 7일 올린 글: 7
|
올려짐: 2012년10월15일 2:58 주제: RECORD, CALLV질문드립니다. |
|
|
올려주신 Semantics에 있는 RECT문법을 보면 LETV와 같이 memory를 allloc해줘야 할것 같은데, 맞나요? 아니면 Assign과 같이 store만 해주면 될까요?
CALLV에서 Mn{l1->v1}...{ln->Vn}이 있는데 이것의 의미를 모르겠습니다. 혹시
Mn{l1->v1, l2->v2........ln->Vn}과 같은 의미인가요? exp가 이와같이 여러개가 들어올때 어떻게 처리해야 할지 모르겠습니다. 한번에 각 exp에 대한 semantics를 돌리고 그 반환된 v들과 최종memory를 담아서 풀어야 할지, 잘안되네요 ㅠㅠ
힌트좀 주세요 조교님!! |
|
위로 |
|
|
이승중
가입: 2010년 6월 22일 올린 글: 561
|
올려짐: 2012년10월15일 14:21 주제: |
|
|
1. 예를 들어 { x := 1 } 라는 구문이 에서 생각해보면
1을 저장할 공간이 없죠.. 현재 환경에 x가 있어도 그건 레코드의 x와는 다른 것이니 거기에 저장하면 안될거고요.. 결국 새로운 메모리 공간을 만들어서 1을 저장한 후에 그 위치를 레코드의 x에 넣어줘야 할겁니다.
2. Mn{l1 -> v1}{l2 -> v2} 는 (Mn{l1->v1}){l2 ->v2} 구요
Mn에 일단 l1, v1을 넣고 그 결과로 나온 메모리에 다시 l2, v2를 넣는다고 생각하시면 됩니다. 결과적으로 Mn{l1 -> v1, l2 -> v2} 랑 같습니다.
인터프리터는 문서에 써있는 대로 순서대로 실행하는 것이 좋습니다.
함수를 여러 개로 나눠서요
코드: | (* exp들을 현재 env에서 실행한 결과들의 리스트와 마지막 메모리 상태 가져오기 *)
let rec getValuesAndMem explist mem : value list * Mem.t = ... in
(* 얻은 value들을 함수의 인자(arglist)에 메모리를 할당해서 envf에 넣기 *)
let rec bindValues envf mem arglist valuelist : Env.t * Mem.t = ... in
(* getValuesAndMem과 bindValues로 얻은 Env.t, Mem.t를 사용해서 함수 바디를 실행. *)
|
이런식으로 여러 단계로 나누고, 각각을 정의하면 덜 헷갈릴수 있겠죠.
각 의미구조마다 어떤 메모리와 어떤 환경이 쓰였는지 주의해서 봐주세요
예를 들어 getValuesAndMem에서 함수로부터 얻은 envf를 사용하여 값을 가져오면 다른 결과가 나오게 됩니다. 문서에는 함수 콜 시점에서의 env로 인자의 모든 식을 계산하고 있죠. 반면 메모리는 식을 실행할 때마다 매번 업데이트 합니다. |
|
위로 |
|
|
|
|
새로운 주제를 올릴 수 없습니다 답글을 올릴 수 없습니다 주제를 수정할 수 없습니다 올린 글을 삭제할 수 없습니다 투표를 할 수 없습니다
|
Powered by phpBB 2.0.21-7 (Debian) © 2001, 2005 phpBB Group Translated by kss & drssay
|