이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
최종욱
가입: 2009년 9월 15일 올린 글: 84
|
올려짐: 2010년10월20일 19:41 주제: 숙제4-1 간단한 테스트셋 |
|
|
안녕하세요. 숙제 잘들 하고 계신가요.
다들 잘 하셨을 거라 믿지만, 확인차 elementary한 간단한 테스트 셋을 올려 봅니다.
수정 #1 (오후 8:15): For에서 이상한 데이터 두개 지웁니다 ㅠ
수정 #2 (오후 8:41): WRITE 부분 테스트 셋을 보강하였습니다.
수정 #3 (오후 10:19):
조교님의 답변을 고려하여, FOR 부분을 비롯한 몇 개 테스트 데이터의 답을 수정했습니다.
--
WRITE를 구현한 경우
코드: |
(* TRICKY WRITE TEST *)
let t := (write 3) in
if t = 3 then
write 1
else write 0
(*RESULT : 3 1 *)
|
-> [수정 #2]에서 추가
코드: |
(* TRICKY WRITE TEST 2 *)
let x := 0 in
((
let t := (write (x:=x+1; 3)) in
if t = 3 then
write 1
else write 0 ); write x)
(*RESULT : 3 1 1 *)
|
LETV를 구현한 경우
코드: | (* UNBIND TEST *)
let x := 1 in
let y := 2 in
((let y := 4 in
write x + y) ;
write x + y)
(* RESULT : 5 3 *)
|
ASSIGN도 구현한 경우
코드: |
(* ASSIGN TEST *)
let t := 1 in
(
(t := 2; write t);
t := 4;
write t;
let t := 3 in
write t;
write t
)
(* result : 2 4 3 3 *)
|
코드: |
(* TRICKY ASSIGN TEST *)
(let t:= 1 in write (t := 3) );
let t := false in
if (t := true) then
write 1
else
write 2
(* result : 3 1 *)
|
LETF, CALLV를 구현한 경우
코드: |
(* CALLV TEST *)
let proc f(x) =
(x := 3;
x := 4;
x := 5)
in
let x := 1 in
( f(x); write x)
(* result : 1 *)
|
코드: |
let proc f(x) =
let proc f(x) =
x + 3
in
f(x)
in
write f(3)
(* result : 6 *)
|
코드: |
let proc f(x) =
let y := x + 3 in
y
in
write f(4)
(* result : 7 *)
|
코드: |
(* TRICKY CALL TEST *)
let t := 8 in
let proc f(x) =
let t := 0 in
t+1
in
write t
(* RESULT : 8 *)
|
RECURSIVE CALL을 구현한 경우
코드: |
(
let proc g(x) =
x + 1
in write g(10)
);
(
let proc f(x) =
if x = 0 then 0
else if x = 1 then 1
else
f(x-1) + f(x-2)
in
write f(10)
)
(* RESULT : 11 55 *)
|
CALL BY REFERENCE 를 구현하면
코드: | let proc f(x) =
x := 3
in
let x := 1 in
( f<x>; write x)
(* result : 3 *)
|
WHILE을 구현한 경우
코드: |
let t := 8 in
while not (t = 0) do
(
write t;
t := t-1
)
(*result : 8 7 6 5 4 3 2 1 *)
|
코드: |
(* TRICKY WHILE *)
let t := 0 in
let b :=
while (t < 10) do
(
write t;
t := t+1
)
in
if b = () then write 111
else write -111
(* result : 0 1 2 3 4 5 6 7 8 9 111 *)
|
FOR 을 구현한 경우
코드: |
(* TRICKY *)
let i := (-1) in
( (for i := 1 to 5 do
(write i)
); write i)
(* RESULT : 1 2 3 4 5 5 *)
|
-- 수정 #3
코드: |
let i := 0 in
for i := 1 to 10 do
(write i;
i := i+1)
(* result : 1 2 3 4 5 6 7 8 9 10 *)
|
코드: |
(* NESTED FOR TEST *)
let i := 0 in let j := 0 in
for i := 1 to 3 do
for j := 1 to 3 do
write (i+j)
(* result : 2 3 4 3 4 5 4 5 6 *)
|
#수정 3에서 엄청 tricky 하게 바뀜 ㅠㅠ
코드: |
(* TRICKY! - NESTED FOR TEST 2 *)
let i := 0 in
for i := 1 to 5 do
(for i := 1 to 5 do
(write i; i := i+3)
; write i)
(*result : 1 2 3 4 5 8 1 2 3 4 5 8 1 2 3 4 5 8 1 2 3 4 5 8 1 2 3 4 5 8 *)
|
코드: |
(* FOR, WHILE SEMANTIC TEST *)
let i := 1 in
let v := (for i := 1 to 2 do write 2 ) in
let w := (while false do write 1 ) in
if v = w then write 1
else write 2
(* result : 2 2 1 *)
|
코드: |
(* TRICKY FOR TEST *)
let i := 0 in
for i := 1 to 10 do
let i := i in
for i := i to 10 do
write i
|
혹시 잘못된거나 이상한 점이 있으면 알려주세요~
참고 : ./run 해서 standard input 로 복붙해 넣으시면 편합니다 _________________ Jongwook Choi
Seoul National University, School of Computer Science & Engineering
최종욱 가 2010년10월20일 22:22에 수정함, 총 2 번 수정됨 |
|
위로 |
|
 |
최종욱
가입: 2009년 9월 15일 올린 글: 84
|
올려짐: 2010년10월20일 20:20 주제: |
|
|
조교님 및 다른 수강생들께 질문합니다.
코드: | let i := 0 in
for i := 0 to 5 do
(i:=i+10; write i) |
처럼, for문안의 반복자 변수의 값이 도중에 바뀌는 경우
K-에서 실행시켜보면
와 같은 결과가 나오는데요,
이게 i 는 루프 안에서 어떤 일이 일어나 i를 지지고 볶고 해도 [...]
결국 처음에 정한 순서대로 옛날 값으로 돌아간다는 뜻으로 보입니다.
(k.ml 에서도 그렇게 코딩되어 있구요)
이게 원래 의도된 K의 semantic인가요?
for loop 안에서 반복자의 값이 바뀌는 경우,
당연히 바뀌는 경우도 고려해야 하는 게 맞다고 생각했는데
그게 아닌가 보군요...... -_-;;
semantic을 애초에 어떻게 정의하느냐에 따라 또 약간 달라질 수 있겠지만요.
semantic 문서를 따로 제공해 주시지 않아서 직접 돌려보고 k.ml을 읽어 봐야 이런 세세한 문제를 알 수 있다는 문제점이 있는것 같습니다 ㅠㅠ
--
위 테스트 셋에서는, 그냥 ./run -k 로 실행했을 때의 결과랑 동일하게 나오도록 숙제를 해야 할 것 같습니다. 테스트셋 돌려보신 분들께 착오를 드려 죄송합니다 ㅠㅠ
이에 조교님들의 의견 기다리겠습니다~^^ _________________ Jongwook Choi
Seoul National University, School of Computer Science & Engineering |
|
위로 |
|
 |
조성근
가입: 2009년 9월 14일 올린 글: 283
|
올려짐: 2010년10월20일 20:55 주제: |
|
|
위에서 보이는 for문의 동작은 의도된 것이 맞습니다.
K-- 언어의 의미구조는 교과서 81페이지에 나와 있습니다. for문을 위한 의미구조를 보시면 매루프마다 반복자 변수의 값이 처음에 정한 순서대로 할당이 되는 것을 알 수 있습니다. |
|
위로 |
|
 |
구원준
가입: 2009년 9월 24일 올린 글: 11
|
올려짐: 2010년10월20일 21:34 주제: |
|
|
감사합니다
테스트 케이스에서 for semantic 잘못 적용한 부분 있어서 수정할 수 있었네요~ |
|
위로 |
|
 |
최종욱
가입: 2009년 9월 15일 올린 글: 84
|
올려짐: 2010년10월20일 22:30 주제: |
|
|
정신나간 코너 케이스 몇개 추가
코드: |
let x := 0 in
let i := 0 in
for i := 0 to (x := x+1; 10) do
i := i + 100 ;
write i;
write x;
write -1
(*RESULT : 110 1 -1 *)
|
코드: | let x := 0 in let i := 0 in let j := 0 in
for i := 0 to (for j := 0 to (i := i+1; 3) do j:=j+4; j) do write i
(* RESULT : 0 1 2 3 4 5 6 7 *)
|
코드: |
(* TRICKY *)
let x := 0 in
( write ((read x) + (read x));
write x )
(* for example, if you input 1 and 2 into standard input, output must be 3 and 2 (the latter) *)
|
ㅠㅠㅠㅠㅠ _________________ Jongwook Choi
Seoul National University, School of Computer Science & Engineering |
|
위로 |
|
 |
최종욱
가입: 2009년 9월 15일 올린 글: 84
|
올려짐: 2010년10월20일 23:11 주제: |
|
|
조성근 씀: | 위에서 보이는 for문의 동작은 의도된 것이 맞습니다.
K-- 언어의 의미구조는 교과서 81페이지에 나와 있습니다. for문을 위한 의미구조를 보시면 매루프마다 반복자 변수의 값이 처음에 정한 순서대로 할당이 되는 것을 알 수 있습니다. |
semantic 이 왜 없나 했더니, 교재에 있었군요 ㅠㅠ
답변 감사합니다! _________________ Jongwook Choi
Seoul National University, School of Computer Science & Engineering |
|
위로 |
|
 |
박상일
가입: 2009년 9월 27일 올린 글: 13
|
올려짐: 2010년10월21일 3:49 주제: |
|
|
우왕 ㅠㅜ 테스트셋 정말 정신 나갔네요... 이런 걸 다 생각하시다니 정말 대단함. |
|
위로 |
|
 |
|