게시판 인덱스

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

semantics가 정의되지 않은 부분이 많습니다.
페이지로 이전  1, 2, 3  다음
 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2005)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
윤상필



가입: 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이 되면 좋겠습니다만.. Smile
위로
사용자 정보 보기 비밀 메시지 보내기
김덕환



가입: 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에 대해 ()가 반환됩니다. Cool

그리고, 남중 님 말씀대로 루프의 의미 정의를 할 수도 있지만, 실제로 그렇게 한다 해도 반환값을 사용하기는 어렵습니다. 일반적으로 루프의 몸체를 실행할 지 안할 지는 실제로 실행해보기 전에는 알 수 없습니다. 즉, 프로그래머는 루프가 몸체에 해당하는 타입의 값을 반환할 지 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를 발생시킨다 입니다.


강타입 언어와 약타입 언어의 기로에 서있습니다. Cool

이번 숙제에서 구현하는 언어는 정적인 타입 시스템이 없기 때문에 남중 님과 상원 님 말처럼 프로그래머에게 좀더 많은 자유를 주는 방향으로 의미를 정의할 수 있습니다.

반면 관점을 바꿔보면, 위의 예의 경우 에러의 원인은 ASSIGN 문인데, 에러 리포팅은 FOR 문에서 일어난다고 볼 수 있습니다. 그 둘 사이의 거리가 멀면 프로그래머가 디버깅하기가 쉽지 않을 겁니다. 따라서, 강하게 타입을 적용하여 ASSIGN 문에서 에러를 내는 게 더 나아보이기도 합니다.

그리고, 하나의 영역(scope) 안에서 하나의 변수가 다양한 타입의 값을 가질 수 있다면 어떤 시점에서 변수의 타입을 알기 위해서는 영역의 헤더 뿐만 아니라 영역 안 전체를 들여다봐야 합니다. 가끔 제약을 주는 것이 오히려 더 편할 때가 있는데, 이 경우도 그런 경우 중의 하나가 아닐까 합니다.

@ 이 글은 조교로서가 아니라 그냥 하나의 의견입니다. 찬성하거나, 반박해주세요. Smile
_________________
TheyAreAsSmartAsYouAre
위로
사용자 정보 보기 비밀 메시지 보내기
김덕환



가입: 2005년 8월 29일
올린 글: 190

올리기올려짐: 2005년10월3일 22:45    주제: Re: Read x를 하면 인용과 함께 답변

임연섭 씀:

READ x를 하면 값을 받아, x변수를 바인딩 하고

메모리에 그 값을 저장하는거 아닌가요?


READ는 이미 바인딩되어 있는 변수에 표준 입력으로부터 읽어들인 정수 값을 저장합니다.

연섭 님 생각처럼 정의할 수도 있겠지만, 그렇게 되면 그 변수의 유효 범위가 어디부터인지도 정의해야 하고, 같은 이름의 변수가 사용되고 있을 때는 어떻게 해야 하는지 등 석연치 않은 부분이 늘어납니다. 간단 명료한 길로 가시죠? Smile
_________________
TheyAreAsSmartAsYouAre
위로
사용자 정보 보기 비밀 메시지 보내기
정민재
손님





올리기올려짐: 2005년10월3일 23:47    주제: READ 에서 인용과 함께 답변

Embarassed 저만 모르는것 같은데요 ㅡ,.ㅡ

READ 를 해석할때 nml 에서 표준입력을 받으려면 어떻게 해야 하나요?
위로
정민재
손님





올리기올려짐: 2005년10월4일 0:42    주제: Re: READ 에서 인용과 함께 답변

정민재 씀:
Embarassed 저만 모르는것 같은데요 ㅡ,.ㅡ

READ 를 해석할때 nml 에서 표준입력을 받으려면 어떻게 해야 하나요?


라이브러리에 다 있었네요 Crying or Very sad
위로
김진현



가입: 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.
위로
사용자 정보 보기 비밀 메시지 보내기 글 올린이의 웹사이트 방문 MSN 메신저
김덕환



가입: 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를 발생시킨다 입니다.


강타입 언어와 약타입 언어의 기로에 서있습니다. Cool

이번 숙제에서 구현하는 언어는 정적인 타입 시스템이 없기 때문에 남중 님과 상원 님 말처럼 프로그래머에게 좀더 많은 자유를 주는 방향으로 의미를 정의할 수 있습니다.

반면 관점을 바꿔보면, 위의 예의 경우 에러의 원인은 ASSIGN 문인데, 에러 리포팅은 FOR 문에서 일어난다고 볼 수 있습니다. 그 둘 사이의 거리가 멀면 프로그래머가 디버깅하기가 쉽지 않을 겁니다. 따라서, 강하게 타입을 적용하여 ASSIGN 문에서 에러를 내는 게 더 나아보이기도 합니다.

그리고, 하나의 영역(scope) 안에서 하나의 변수가 다양한 타입의 값을 가질 수 있다면 어떤 시점에서 변수의 타입을 알기 위해서는 영역의 헤더 뿐만 아니라 영역 안 전체를 들여다봐야 합니다. 가끔 제약을 주는 것이 오히려 더 편할 때가 있는데, 이 경우도 그런 경우 중의 하나가 아닐까 합니다.

@ 이 글은 조교로서가 아니라 그냥 하나의 의견입니다. 찬성하거나, 반박해주세요. Smile

ASSIGN 문에서 에러를 내는게 더 낫다고는 생각하지만, 이미 할당된 변수에 다른 타입의 값을 할당하는 구문을 버리지 못해서 그런 결론에 도달했습니다.
제 눈은
코드:
val x = 1
...
val x = "new" // (1)
...


코드:
var x
...
x := 1
...
x := "new" // (2)
...

를 (거의) 같은 코드로 보고 있습니다. 영역의 헤더를 본다는 말이 정확히 무슨 뜻인지는 모르겠습니다만, (1) 위치에서 x의 타입을 결정하는 것과 (2) 위치에서 x의 타입을 결정하는 것에 별 차이가 없을 것 같습니다.
다른 타입의 재할당을 허용하지 않는다면 프로그래머가 변수에 할당할 때마다 "내가 이 변수에 이미 값을 할당했었는지, 했었다면 어떤 타입의 값이었는지"를 확인해야하는 불편함이 있지 않을까요?

뭐, 실상은 선언과 할당을 분리하면서 "처음 할당하는 순간, 변수의 타입을 결정한다"라는 개념이 "싫어서" 그런 겁니다. 선언할 때 타입을 정하던지, 선언과 할당을 동시에 하면 좋을 것 같은데 말입니다. (차라리 선언없이 사용하던지..) Smile
위로
사용자 정보 보기 비밀 메시지 보내기
서상원



가입: 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이어야 하는"거 아니었나요? (물론 이것도 타입 일치를 고려했을 때의 얘기지만... Sad)
위로
사용자 정보 보기 비밀 메시지 보내기
서상원



가입: 2005년 9월 27일
올린 글: 33

올리기올려짐: 2005년10월5일 2:01    주제: 인용과 함께 답변

이미 의미 정의가 나왔군요. ^^;
위로
사용자 정보 보기 비밀 메시지 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2005) 시간대: GMT + 9 시간(한국)
페이지로 이전  1, 2, 3  다음
페이지 23

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


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