이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
윤상필
가입: 2005년 9월 25일 올린 글: 14 위치: 아스트랄계
|
올려짐: 2005년10월3일 16:48 주제: |
|
|
서상원 씀: | 윤상필 씀: | ASSIGN의 값이 UNIT인지 아니면 대입되고 있는 값인지 |
덧붙여서 "이미 값이 할당된 변수에 타입이 다른 값이 새로 할당되면 어떻게 할 것인지"
예를 들자면
코드: | for x := 1 to 10 in
...
x := "X-man"
...
end |
| 아직은 타입 시스템이 들어가지 않았으므로 그냥 허용하는게 좋을 것 같습니다. 위 예제에서는 두번째 돌때 for문에서 문자열과 정수를 더할 수 없다는 runtime error가 발생하겠군요. |
|
위로 |
|
|
서상원
가입: 2005년 9월 27일 올린 글: 33
|
올려짐: 2005년10월3일 17:36 주제: |
|
|
제 결론도 for문의 검사 때 Error를 발생시킨다 입니다.
다만 타입 시스템을 도입해도 다른 타입의 값을 새로 할당하는 걸 허용해야 하지 않을까 생각합니다.
코드: |
var x
x := 100
...
x := "X-man"
... |
..처럼 쓰고 싶을 때도 있으니까요. 매번 다른 변수를 선언하는 것은 이름 사용에 제약이 생기고, x를 "다시 선언(var x)"하는 것은 번거로워 보입니다.
그리고 ASSIGN의 값은 unit이 되면 좋겠습니다만.. |
|
위로 |
|
|
김덕환
가입: 2005년 8월 29일 올린 글: 190
|
올려짐: 2005년10월3일 21:14 주제: |
|
|
윤상필 씀: | 10. READ의 대상 변수가 unbound일 경우 입력을 받은 다음 raise Error하는지 아니면 받은 후에 하는지 |
어차피 에러를 낼 거라면 한시라도 빨리 내는 게 좋지 않을까요? _________________ TheyAreAsSmartAsYouAre |
|
위로 |
|
|
임연섭 손님
|
올려짐: 2005년10월3일 21:30 주제: Read x를 하면 |
|
|
김덕환 씀: | 윤상필 씀: | 10. READ의 대상 변수가 unbound일 경우 입력을 받은 다음 raise Error하는지 아니면 받은 후에 하는지 |
어차피 에러를 낼 거라면 한시라도 빨리 내는 게 좋지 않을까요? |
수업시간에 잘 안들어서 그런지.. ^^; 계속 헷갈리는데요.
READ x를 하면 값을 받아, x변수를 바인딩 하고
메모리에 그 값을 저장하는거 아닌가요? |
|
위로 |
|
|
김덕환
가입: 2005년 8월 29일 올린 글: 190
|
올려짐: 2005년10월3일 21:41 주제: Re: re : semantics가 정의되지 않은 부분이 많습니다. |
|
|
김남중 씀: | 일단 while이나 for loop, 그밖의 if else 등의 구문에서 nML의 경우 마지막 exp의 결과값이 반환이 되는데요.
그렇다면 저도 마지막 계산 결과가 기본적으로 반환되고, 반환값이 없는 경우 UNIT이 반환되는 것이 맞다고 봅니다. |
우선 nML은 while과 for에 대해 ()가 반환됩니다.
그리고, 남중 님 말씀대로 루프의 의미 정의를 할 수도 있지만, 실제로 그렇게 한다 해도 반환값을 사용하기는 어렵습니다. 일반적으로 루프의 몸체를 실행할 지 안할 지는 실제로 실행해보기 전에는 알 수 없습니다. 즉, 프로그래머는 루프가 몸체에 해당하는 타입의 값을 반환할 지 UNIT 값을 반환할 지 예측할 수가 없습니다. 어떤 타입의 값을 반환할 지 모르므로 그 이후에 그 값을 사용하기는 상당히 어렵습니다. _________________ TheyAreAsSmartAsYouAre
김덕환 가 2005년10월3일 22:47에 수정함, 총 1 번 수정됨 |
|
위로 |
|
|
김덕환
가입: 2005년 8월 29일 올린 글: 190
|
올려짐: 2005년10월3일 22:24 주제: |
|
|
윤상필 씀: |
서상원 씀: |
덧붙여서 "이미 값이 할당된 변수에 타입이 다른 값이 새로 할당되면 어떻게 할 것인지"
예를 들자면
코드: |
for x := 1 to 10 in
...
x := "X-man"
...
end
|
|
아직은 타입 시스템이 들어가지 않았으므로 그냥 허용하는게 좋을 것 같습니다. 위 예제에서는 두번째 돌때 for문에서 문자열과 정수를 더할 수 없다는 runtime error가 발생하겠군요.
|
서상원 씀: |
제 결론도 for문의 검사 때 Error를 발생시킨다 입니다.
|
강타입 언어와 약타입 언어의 기로에 서있습니다.
이번 숙제에서 구현하는 언어는 정적인 타입 시스템이 없기 때문에 남중 님과 상원 님 말처럼 프로그래머에게 좀더 많은 자유를 주는 방향으로 의미를 정의할 수 있습니다.
반면 관점을 바꿔보면, 위의 예의 경우 에러의 원인은 ASSIGN 문인데, 에러 리포팅은 FOR 문에서 일어난다고 볼 수 있습니다. 그 둘 사이의 거리가 멀면 프로그래머가 디버깅하기가 쉽지 않을 겁니다. 따라서, 강하게 타입을 적용하여 ASSIGN 문에서 에러를 내는 게 더 나아보이기도 합니다.
그리고, 하나의 영역(scope) 안에서 하나의 변수가 다양한 타입의 값을 가질 수 있다면 어떤 시점에서 변수의 타입을 알기 위해서는 영역의 헤더 뿐만 아니라 영역 안 전체를 들여다봐야 합니다. 가끔 제약을 주는 것이 오히려 더 편할 때가 있는데, 이 경우도 그런 경우 중의 하나가 아닐까 합니다.
@ 이 글은 조교로서가 아니라 그냥 하나의 의견입니다. 찬성하거나, 반박해주세요. _________________ TheyAreAsSmartAsYouAre |
|
위로 |
|
|
김덕환
가입: 2005년 8월 29일 올린 글: 190
|
올려짐: 2005년10월3일 22:45 주제: Re: Read x를 하면 |
|
|
임연섭 씀: |
READ x를 하면 값을 받아, x변수를 바인딩 하고
메모리에 그 값을 저장하는거 아닌가요?
|
READ는 이미 바인딩되어 있는 변수에 표준 입력으로부터 읽어들인 정수 값을 저장합니다.
연섭 님 생각처럼 정의할 수도 있겠지만, 그렇게 되면 그 변수의 유효 범위가 어디부터인지도 정의해야 하고, 같은 이름의 변수가 사용되고 있을 때는 어떻게 해야 하는지 등 석연치 않은 부분이 늘어납니다. 간단 명료한 길로 가시죠? _________________ TheyAreAsSmartAsYouAre |
|
위로 |
|
|
정민재 손님
|
올려짐: 2005년10월3일 23:47 주제: READ 에서 |
|
|
저만 모르는것 같은데요 ㅡ,.ㅡ
READ 를 해석할때 nml 에서 표준입력을 받으려면 어떻게 해야 하나요? |
|
위로 |
|
|
정민재 손님
|
올려짐: 2005년10월4일 0:42 주제: Re: READ 에서 |
|
|
정민재 씀: | 저만 모르는것 같은데요 ㅡ,.ㅡ
READ 를 해석할때 nml 에서 표준입력을 받으려면 어떻게 해야 하나요? |
라이브러리에 다 있었네요 |
|
위로 |
|
|
김진현
가입: 2005년 9월 20일 올린 글: 91 위치: SNUCSE OPT. lab.
|
올려짐: 2005년10월4일 0:44 주제: |
|
|
코드: | val buf = String.create 256
val temp = input stdin buf 0 256
val read_val = int_of_string (String.sub buf 0 (temp - 1)) |
더 좋은 방법이 있을 것도 같습니다.
(http://dada.perl.it/shootout/ocamlb_allsrc.html 를 참고하였습니다)
덧. 뒷북이네요 -ㅅ- _________________ The kingdom of heaven has been forcefully advancing, and forceful men lay hold of it. |
|
위로 |
|
|
김덕환
가입: 2005년 8월 29일 올린 글: 190
|
올려짐: 2005년10월4일 10:47 주제: |
|
|
김진현 씀: |
코드: |
val buf = String.create 256
val temp = input stdin buf 0 256
val read_val = int_of_string (String.sub buf 0 (temp - 1))
|
|
Why not Pervasives.read_int? _________________ TheyAreAsSmartAsYouAre |
|
위로 |
|
|
진민식 손님
|
올려짐: 2005년10월4일 23:01 주제: if2 문의 semantics 에 대해서. |
|
|
서상원 씀: |
e1과 e2의 타입을 같게.
즉 IF1은 UNIT 타입, IF2는 같은 타입이고 그 값을 반환.
|
interpreter를 만들다 보니, IF2에서 e1, e2가 같은 타입임을 알려면,
if 문의 condition이 true이든 false이든 상관없이 e1과 e2를 모두
evaluate해야 하는 것 같습니다.
if 문의 semantics를 생각해보면, test의 결과에 따라서 e1, e2한쪽만 evaluate하는 것이
자연스러울 것 같습니다.
물론 K에서 사용되는 if의 semantics를 e1, e2둘 다 evaluate하는 것으로 하면
어쩔 수 없지만, x가 1이면 x를 리턴하고 아니면, 무한 loop를 도는 프로그램을 작성
하고 싶을 때
if x then x else (while true do 1; 2)
위와 같은 프로그램에서 둘 다 evaluate하게 되면 원하는 결과를 얻기 어려울 것 같습니다. 조금 이상한 예 이지만 e1, e2를 다 evaluate하는 건 지금까지 우리가 생각 했던 if와는 너무 다르게 동작하는 것 같습니다.
그래서 if2의 결과를 while, for, if처럼 unit을 리턴하는 것으로 하고,e1과 e2
의 결과값의 type을 신경쓰지 않는 것이 어떨까요? |
|
위로 |
|
|
서상원
가입: 2005년 9월 27일 올린 글: 33
|
올려짐: 2005년10월5일 1:32 주제: |
|
|
김덕환 씀: | 윤상필 씀: |
서상원 씀: |
덧붙여서 "이미 값이 할당된 변수에 타입이 다른 값이 새로 할당되면 어떻게 할 것인지"
예를 들자면
코드: |
for x := 1 to 10 in
...
x := "X-man"
...
end
|
|
아직은 타입 시스템이 들어가지 않았으므로 그냥 허용하는게 좋을 것 같습니다. 위 예제에서는 두번째 돌때 for문에서 문자열과 정수를 더할 수 없다는 runtime error가 발생하겠군요.
|
서상원 씀: |
제 결론도 for문의 검사 때 Error를 발생시킨다 입니다.
|
강타입 언어와 약타입 언어의 기로에 서있습니다.
이번 숙제에서 구현하는 언어는 정적인 타입 시스템이 없기 때문에 남중 님과 상원 님 말처럼 프로그래머에게 좀더 많은 자유를 주는 방향으로 의미를 정의할 수 있습니다.
반면 관점을 바꿔보면, 위의 예의 경우 에러의 원인은 ASSIGN 문인데, 에러 리포팅은 FOR 문에서 일어난다고 볼 수 있습니다. 그 둘 사이의 거리가 멀면 프로그래머가 디버깅하기가 쉽지 않을 겁니다. 따라서, 강하게 타입을 적용하여 ASSIGN 문에서 에러를 내는 게 더 나아보이기도 합니다.
그리고, 하나의 영역(scope) 안에서 하나의 변수가 다양한 타입의 값을 가질 수 있다면 어떤 시점에서 변수의 타입을 알기 위해서는 영역의 헤더 뿐만 아니라 영역 안 전체를 들여다봐야 합니다. 가끔 제약을 주는 것이 오히려 더 편할 때가 있는데, 이 경우도 그런 경우 중의 하나가 아닐까 합니다.
@ 이 글은 조교로서가 아니라 그냥 하나의 의견입니다. 찬성하거나, 반박해주세요. |
ASSIGN 문에서 에러를 내는게 더 낫다고는 생각하지만, 이미 할당된 변수에 다른 타입의 값을 할당하는 구문을 버리지 못해서 그런 결론에 도달했습니다.
제 눈은
코드: | val x = 1
...
val x = "new" // (1)
... |
와
코드: | var x
...
x := 1
...
x := "new" // (2)
... |
를 (거의) 같은 코드로 보고 있습니다. 영역의 헤더를 본다는 말이 정확히 무슨 뜻인지는 모르겠습니다만, (1) 위치에서 x의 타입을 결정하는 것과 (2) 위치에서 x의 타입을 결정하는 것에 별 차이가 없을 것 같습니다.
다른 타입의 재할당을 허용하지 않는다면 프로그래머가 변수에 할당할 때마다 "내가 이 변수에 이미 값을 할당했었는지, 했었다면 어떤 타입의 값이었는지"를 확인해야하는 불편함이 있지 않을까요?
뭐, 실상은 선언과 할당을 분리하면서 "처음 할당하는 순간, 변수의 타입을 결정한다"라는 개념이 "싫어서" 그런 겁니다. 선언할 때 타입을 정하던지, 선언과 할당을 동시에 하면 좋을 것 같은데 말입니다. (차라리 선언없이 사용하던지..) |
|
위로 |
|
|
서상원
가입: 2005년 9월 27일 올린 글: 33
|
올려짐: 2005년10월5일 1:56 주제: Re: if2 문의 semantics 에 대해서. |
|
|
진민식 씀: | 서상원 씀: |
e1과 e2의 타입을 같게.
즉 IF1은 UNIT 타입, IF2는 같은 타입이고 그 값을 반환.
|
interpreter를 만들다 보니, IF2에서 e1, e2가 같은 타입임을 알려면,
if 문의 condition이 true이든 false이든 상관없이 e1과 e2를 모두
evaluate해야 하는 것 같습니다.
if 문의 semantics를 생각해보면, test의 결과에 따라서 e1, e2한쪽만 evaluate하는 것이
자연스러울 것 같습니다.
물론 K에서 사용되는 if의 semantics를 e1, e2둘 다 evaluate하는 것으로 하면
어쩔 수 없지만, x가 1이면 x를 리턴하고 아니면, 무한 loop를 도는 프로그램을 작성
하고 싶을 때
if x then x else (while true do 1; 2)
위와 같은 프로그램에서 둘 다 evaluate하게 되면 원하는 결과를 얻기 어려울 것 같습니다. 조금 이상한 예 이지만 e1, e2를 다 evaluate하는 건 지금까지 우리가 생각 했던 if와는 너무 다르게 동작하는 것 같습니다.
그래서 if2의 결과를 while, for, if처럼 unit을 리턴하는 것으로 하고,e1과 e2
의 결과값의 type을 신경쓰지 않는 것이 어떨까요? 이번 숙제에서는 IF2의 타입 일치가 꼭 필요한 요소는 아닐테니까요. |
그렇군요. 우리는 동적 검사를 하기 때문에 실행해보지 않으면 타입을 모르겠네요. 꼭 위와 같은 경우가 아니더라도 e2가 메모리를 변경시키거나 하면 원하는 결과와 다르게 되겠죠.
앞으로 타입 시스템이 어떻게 덧붙게 될지는 모르지만, 지금은 unit을 리턴하든지 값을 리턴하든지 e1과 e2의 타입 일치는 고려하지 못하겠군요.
일단 값을 리턴하는 걸로 하고, 나중에 타입 시스템이 붙으면 일치 여부는 그 때 고려하는 걸로 하면 어떨까요? 이번 숙제에서는 IF2의 타입 일치가 꼭 필요한 부분은 아닐 것 같으니...
그리고 IF1은 unit을 리턴하는게 아니라 "unit이어야 하는"거 아니었나요? (물론 이것도 타입 일치를 고려했을 때의 얘기지만... ) |
|
위로 |
|
|
서상원
가입: 2005년 9월 27일 올린 글: 33
|
올려짐: 2005년10월5일 2:01 주제: |
|
|
이미 의미 정의가 나왔군요. ^^; |
|
위로 |
|
|
|