이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
강신행 손님
|
올려짐: 2005년10월18일 16:46 주제: 숙제 3-1에서 generic assign질문입니다 - 테스트셋 첨부 |
|
|
코드: |
let
x := 4
in
x := malloc(5);
write 3;
*x := 5;
write x
end
|
다음과 같은 코드입니다.
x를 Num형 변수로 잡아서 4를 assign한다음에
in 안에서 x에다가 malloc으로 생성된 location을 집어넣게 됩니다.
사실 에러는 여기서 나는게 마땅하겠지요......
(스펙을 보았을 때)
하지만 아무리 해도 거기서 에러가 날 수 있게 만들지를 못하겠습니다.
여러분은 어떤지 궁금해서,
그리고 어떻게 해결해야 할지 궁금해서 질문합니다
제가 예상한 결과는
실행하자 마자
와 같은 에러가 나는 것인데요 어떠세요? |
|
위로 |
|
|
강신행
가입: 2005년 10월 18일 올린 글: 5
|
올려짐: 2005년10월18일 16:48 주제: 일단 제 결과는 이렇습니다. |
|
|
코드: |
martini:~/pl3> ./run examples/test3.k-
3
Fatal error: exception 1.K.Error("Unit type is used as Location type")
martini:~/pl3>
|
|
|
위로 |
|
|
이기석
가입: 2005년 10월 3일 올린 글: 33
|
올려짐: 2005년10월18일 19:19 주제: |
|
|
스펙에 보면 generic assign 에서
왼쪽에 VAR 이 오지 못한다고 돼있으니깐
당연히 타입체크해서 익셉션 발생시켜줘야 되는것 아닌가요?; |
|
위로 |
|
|
박대준
가입: 2005년 10월 7일 올린 글: 245
|
올려짐: 2005년10월18일 20:01 주제: |
|
|
주어진 semantics 에 따르면,
는 맞는 표현입니다. 단지 우리가 생각하는 의미가 아닌 것 뿐이죠.
저 코드의 의미는 malloc(5) 해서 생긴 주소값을 단순히 int value 로 생각하고 x 에 넣는 것 뿐입니다.
따라서, 다음 코드는 의미가 없죠.
왜냐면, x 는 int value 를 저장하고 있기 때문에, * 를 붙일 수 없는 겁니다.
솔직히, 처음 코드는 generic assign 이 아닙니다.
굳이.. generic assign 을 하고 싶으면, 다음과 같이 사용하셔야 합니다.
코드: | (x + 0) := malloc(5); |
그러면 우리가 생각한 대로 에러가 날 겁니다.
K- 는 C 와 포인터 사용이 비슷하긴 하지만 좀 달라요.
그 때문에, 수업시간에 혼란스러운 점이 있어서 한참 토론하기도 했죠.
어떠한 의미 정의가 자연스러운지는 모르겠지만, 아무튼 좀 혼동되죠.
---------------------------------
이기석 씀: | 스펙에 보면 generic assign 에서
왼쪽에 VAR 이 오지 못한다고 돼있으니깐
당연히 타입체크해서 익셉션 발생시켜줘야 되는것 아닌가요?; |
ASSIGNV exp 의 semantics 를 보면,
x 는 id 가 맞고,
malloc(5) 는 exp 이 맞고, malloc(5) 가 Loc 이라는 Value 를 리턴하기 때문에,
전혀 semantics 상으로 문제없는 코드라고 생각합니다.
그리고 type check 은 이번 숙제에는 포함되지 않는 것 같은데, 아닌가요? |
|
위로 |
|
|
이기석
가입: 2005년 10월 3일 올린 글: 33
|
올려짐: 2005년10월19일 2:22 주제: |
|
|
박대준 씀: |
이기석 씀: | 스펙에 보면 generic assign 에서
왼쪽에 VAR 이 오지 못한다고 돼있으니깐
당연히 타입체크해서 익셉션 발생시켜줘야 되는것 아닌가요?; |
ASSIGNV exp 의 semantics 를 보면,
x 는 id 가 맞고,
malloc(5) 는 exp 이 맞고, malloc(5) 가 Loc 이라는 Value 를 리턴하기 때문에,
전혀 semantics 상으로 문제없는 코드라고 생각합니다.
그리고 type check 은 이번 숙제에는 포함되지 않는 것 같은데, 아닌가요? |
원래 글이 generic assign에 관한 질문이어서 착각을 했습니다.
이부분을 ASSIGNG로 착각했습니다-;
문제가 된 부분은 ASSIGNV 가 맞네요-
그리고 제가 말한 type checking은 PL에서의 type checking을 말하는게 아니라
nml 상에서 패턴 매칭을 통한 타입 체크를 말한 것이었습니다. ^^
ASSIGNV에서 패턴 매칭되기 때문에 실제로 검사해줄 필요는 없지만요ㅎㅎ |
|
위로 |
|
|
이광근
가입: 2005년 8월 29일 올린 글: 68
|
올려짐: 2005년10월19일 9:50 주제: 오해 |
|
|
쓰레드가 오해가 있는듯 하군요.
"x := malloc(5)"
은 의미구조(semantics)정의에 아무 문제가 없다.
x라는 주소에 malloc(5)가 만드는 주소를 넣고,
"*x := 3"
은 malloc된 주소(*x의 값 = x에 있는 값 = malloc(5)된 주소)
에 3을 넣고
그리곤 "write x"가 의미가 없구나. 정의에 보면, 정수값만 출력가능한데
식 "x"가 x에 있는 값 (malloc된 주소값)을 리턴하므로.
-K |
|
위로 |
|
|
현경렬
가입: 2005년 9월 28일 올린 글: 19 위치: 스쿨
|
올려짐: 2005년10월19일 11:51 주제: Re: 오해 |
|
|
이광근 씀: | 쓰레드가 오해가 있는듯 하군요.
"x := malloc(5)"
은 의미구조(semantics)정의에 아무 문제가 없다.
x라는 주소에 malloc(5)가 만드는 주소를 넣고,
"*x := 3"
은 malloc된 주소(*x의 값 = x에 있는 값 = malloc(5)된 주소)
에 3을 넣고
그리곤 "write x"가 의미가 없구나. 정의에 보면, 정수값만 출력가능한데
식 "x"가 x에 있는 값 (malloc된 주소값)을 리턴하므로.
-K |
K- 정의 문서를 보면, E1 := E2 에서 E1을 계산한 값은 Location 이어야 하지 않나요?
그러니까
코드: |
x := malloc(3);
*x := 3
|
의 경우에는 (*x의 값 = x에 있는 값 = Bot)에 3을 넣으려고 하니까,
(Bot은 Location이 아니므로)
에러가 발생하는 게 맞을 것 같아요. (뜨끔) _________________ Programming Rumble |
|
위로 |
|
|
이광근
가입: 2005년 8월 29일 올린 글: 68
|
올려짐: 2005년10월19일 14:26 주제: Re: 오해 |
|
|
현경렬 씀: | 이광근 씀: | 쓰레드가 오해가 있는듯 하군요.
"x := malloc(5)"
은 의미구조(semantics)정의에 아무 문제가 없다.
x라는 주소에 malloc(5)가 만드는 주소를 넣고,
"*x := 3"
은 malloc된 주소(*x의 값 = x에 있는 값 = malloc(5)된 주소)
에 3을 넣고
그리곤 "write x"가 의미가 없구나. 정의에 보면, 정수값만 출력가능한데
식 "x"가 x에 있는 값 (malloc된 주소값)을 리턴하므로.
-K |
K- 정의 문서를 보면, E1 := E2 에서 E1을 계산한 값은 Location 이어야 하지 않나요?
그러니까
코드: |
x := malloc(3);
*x := 3
|
의 경우에는 (*x의 값 = x에 있는 값 = Bot)에 3을 넣으려고 하니까,
(Bot은 Location이 아니므로)
에러가 발생하는 게 맞을 것 같아요. (뜨끔) |
경렬이가 맞네요.
식 "*x"의 값은 변수 식 "x"의 값-- 즉 malloc된 주소-- 에 있는 값(*) 이므로 Bot 이네요. |
|
위로 |
|
|
|