이전 주제 보기 :: 다음 주제 보기 |
글쓴이 |
메시지 |
이준
가입: 2006년 9월 7일 올린 글: 30
|
올려짐: 2006년10월26일 15:41 주제: 과제에 대한 질문입니다!! |
|
|
고민을 해보았는데.. 밑에 이미쓰신 어느분처럼 저역시도 이해가 안가는 부분이 있어 이렇게 질문하기로 했습니다;;
내용이 좀 길수도 있고, 글로 정확히 의미를 전달하기 어렵지 않을까 싶어 방금전에 교수님과 조교님 계신곳 두곳을 방문했는데 모두 안계시더라구요..
조교님 두분은 모두 출장을..;;;
그래서! 하는수 없이 글로 여쭐까 합니다. 최대한 잘 정리해 보겠습니다.
일단 제 의문은 밑에 이미 1번에 대한 의문을 적어주신것과 거의 같습니다.
숙제 1번에 대한 의문이 한개가 아니므로 가정을 하면서 정리하겠습니다.
일단 f를 f'로 바꾸는 부분입니다. spec에서 이 부분의 설명이 모호하게 느껴집니다.
f의 정의 부분에서 인자이름이 쓰이는 곳을 적절히 바꾸면 된다고 하셨는데, k- code에서의 정의 인지,
dissolveCbr 내부에서 call f<x>가 들어오면 f를 f'으로 적절히 바꾸어 주라는 뜻인지를 모르겠습니다.
저는 dissolveCbr은 그럴만한 능력이 없다고 판단하여, k- code에서 f를 정의하는 부분을 f'로 변경해 주어야 한다고 이해했습니다.
'송수현'님과 같습니다. 그리고 여기에 가정1을 둡니다.
가정1 : f는 사용자가 f'로 바꾸어 주는 것이다.
가정 1이 맞다고 생각하기로 했으니 dissolveCbr의 역할은 '송수현'님의 말씀과 같이
call f<x>(=CALLR(f,x))를 call f'(&x) (= CALLV(f',AMPER(x)))로 바꾸어주는것 뿐이라고 생각하게 되었습니다.
그런데 생각해 보니 f라는 procedure은 없습니다. 이미 f'로 바뀌었지요.
그러므로 call f<x>가 아니라 call f'<x>가 되었을 것입니다. 즉 call f'<x> 를 call f'(&x)로 바꾸어 주는것 뿐인데요,
여기서 또 하나의 의문입니다. <x>를 왜 써야 하는가 입니다.
지금까지 저의 생각이 진행되어온 과정을 보면 dissolveCbr을 쓰기위해 굉장히 억지스럽게 진행되어 왔다고 여겨 집니다.
dissolveCbr이 무언가 바꾸어 주긴 해야겠고 바꿀 것을 찾다보니 <x> 를 (&x)로 바꾸어 주는 것입니다.
아무리 생각해도 어색하네요.. 굳이 <x>를 써야하는 이유는 어디에 있는것일까요.
이미 설탕은 녹여버렸고, 사용자에게도 그 사실을 알렸을 것입니다. (가정1)
이미 call f(x)가 있고 *x 와 상응하는 &x가 정의되어 있는 상황에서
call f<x>라는 syntax를 추가하는것은 굉장히 어색합니다. 오히려 사용자가 스스로
call f(&x)를 사용하는것이 훨씬 자연스럽지 않을까요? 이미 f라는 procedure가 그 내부에서
(*x) := (*x) + 1 과 같은 일을 한다고 정의되었다면 인자를 줄때 (&x)를 주는 것이 더 자연스럽다고 생각합니다.
물론 <x>로 주면 그 주소를 전달해주는거야~ 라고 설명해 주면 사용자가
그정도는 이해해 줄테지만 이미 &x라는 구문이 존재하는데 굳이 call f<x>라는 새로운 syntax를
사용하게 하는것은 너무 dissolveCbr을 사용하기 위해 억지를 부리는게 아닌가 하는 생각이 듭니다.
다시말해 dissolveCbr은 이미 풀려버린 설탕을 다시한번 풀어보겠다고 call f<x>라는 이상한 구문을 추가시키고는
그것이 들어오면 call f(&X)로 바꿔 줄께~
라고 하고 있는것만 같네요. 결국 그 dissolveCbr이란 이름에 걸맞지 않는것 같습니다.
이름에 걸맞는 행동은 call f<x>를 받아 dissolveCbr내에서 x := x+1 을 (*x) := (*X) + 1 로
바꾸어 주는것이 아닐까 생각합니다. 결국 가정1이 틀렸다고 봐야 하는데요..
그러면 또 다시 dissolveCbr이 그런 역할을 하기에는 인자가 부족한것 아닌가 싶어지는 것이지요...
그래서 이렇게 질문을 드립니다. 제가 생각하는 내용이 정말 맞는건가요?
(가정1도 맞고 그에따라 생각해낸 <x>의 어색한 추가가 맞는것 인가요?)
맞다면야 어렵지 않게 문제를 풀 듯도 합니다만, 위의 생각들 대로 제가 억지를 쓰는건
아닌가 싶어서요. 답변 부탁드립니다.
그리고 3번에서요 이정도로 힌트는 마친다고 하셨는데, 그렇다면 우리는 그 힌트가 말해주는 부분만
수정하면 되는 것일까요, 아니면 추가적으로 더욱 높은 performance를 위해 고민해야 하는 것일까요.
직접적으로 말해도 될지 불안하기는 한데...음... 아무래도 모호하니..
직접적으로 여쭈겠습니다.
tail-recursive call만 잡아주면 되는 건가요? 아님 그 이상도 찾아봐야 하나요..
(실제로 가능한지조차도 모르겠기는 합니다만.. )
후자쪽이라면.. ㄷㄷㄷ
답변 기다리겠습니다~ 혹시 학우분들 중에서도 제 고민의 해답을 알고 계시는 분이 계시다면
부디 그 해답을 공유해 주시면 감사하겠습니다
혹, 저의 질문이 숙제의 답을 요구한다거나 혹은 숙제의 답을 퍼뜨리고 있다거나 하는 것은 아니겠지요?
행여라도 그렇다고 하신다면 바로 삭제하겠습니다.;; |
|
위로 |
|
|
장민석
가입: 2006년 9월 5일 올린 글: 165
|
올려짐: 2006년10월27일 14:14 주제: Re: 과제에 대한 질문입니다!! |
|
|
인용: | 일단 f를 f'로 바꾸는 부분입니다. spec에서 이 부분의 설명이 모호하게 느껴집니다.
f의 정의 부분에서 인자이름이 쓰이는 곳을 적절히 바꾸면 된다고 하셨는데, k- code에서의 정의 인지, dissolveCbr 내부에서 call f<x>가 들어오면 f를 f'으로 적절히 바꾸어 주라는 뜻인지를 모르겠습니다.
저는 dissolveCbr은 그럴만한 능력이 없다고 판단하여, k- code에서 f를 정의하는 부분을 f'로 변경해 주어야 한다고 이해했습니다. |
1. 제출하는 파일은 dissolveCbr 정의 코드 뿐이니, dissoveCbr이 알아서 f를 f'으로 바꾸어야 한다고 생각합니다.
인용: | 지금까지 저의 생각이 진행되어온 과정을 보면 dissolveCbr을 쓰기위해 굉장히 억지스럽게 진행되어 왔다고 여겨 집니다.
dissolveCbr이 무언가 바꾸어 주긴 해야겠고 바꿀 것을 찾다보니 <x> 를 (&x)로 바꾸어 주는 것입니다.
아무리 생각해도 어색하네요.. 굳이 <x>를 써야하는 이유는 어디에 있는것일까요. |
2. 일반적으로, call f(&x)와 call f<x>는 같은 값을 가지지 않습니다. &x는 단순히 x의 주소값이죠. 그러니까 call f(&x)는 x의 주소값을 인자로 받아 f를 실행하는 것이고, call f<x>는 x에 저장된 값을 인자로 받아 f를 실행하되 함수 실행 시 x에 저장된 값이 바뀔 수 있는 것이죠(call by ref).
그래서 f를 f'으로 바꾸어야 하는 것이지요.
아...그래픽스 숙제 때문에 PL숙제는 아직 시작도 못하고 있네요 ㅠ.ㅠ |
|
위로 |
|
|
박대준
가입: 2005년 10월 7일 올린 글: 245
|
올려짐: 2006년10월27일 15:32 주제: |
|
|
어제는 프로젝트 발표때문에 외부에 나가게 되어 없었습니다.
질문하러 찾아오셨는데, 안타깝군요.
가정 1에 따른 긴 글을 적어주셨는데요, 안타깝게도 가정 1은 맞지 않습니다.
여러분이 1번 숙제(함수 녹이기)에서 하셔야 할 것은
f<x>같은 call-by-reference semantics가 허용되는 언어로 짠 프로그램을,
call-by-reference semantics가 없는 언어로 짠 프로그램으로 변환하는 것입니다.
(사용자는 어떠한 행동도 하지 않습니다.)
이 때, 변환된 프로그램은 변환전 프로그램과 동일해야 합니다.
이 때, 동일하다는 것의 정의는 실행 후의 결과 값이 같은 것을 의미합니다.
결과 값만 같으면 된다는 것에 주목하시길 바랍니다.
결과 메모리나 환경 등은 같지 않아도 된다는 의미입니다.
문제 설명에서, f를 f'으로 바꾸면 될 것 같다는 이야기는,
원래 f라는 함수를 call-by-value로 호출하는 부분도 있을 것이기 때문에,
f<x>라고 호출하는 부분을 위해서 새로운 f'을 정의하겠다는 것입니다.
이런 상황을 생각해 봅시다.
다른 사람이 A라는 언어로 짠 코드를 사용하고 싶은데, 전 B라는 언어를 사용합니다.
그런데, A라는 언어와 B라는 언어는 모두 동일한데, A라는 언어가 추가적으로 call-by-reference semantics를 지원한다고 합시다.
그래서 결국, A라는 언어로 짠 코드에서 call-by-reference로 호출한 f<x>같은 것을 모두 B라는 언어로 바꾸고 싶은 것입니다.
결국 여러분은 그러한 일을 하는 dissolveCbr을 구현하시는 것입니다.
3번 문제에서는 말씀하신대로, tail-recursive-call만 잡아주시면 됩니다.
tail-recurtive-call이 아닌 것까지 하시면 더 좋겠지요.
만약 더 많은 경우까지 잡아서 줄일 수 있다면, 구현하시고, 코멘트로 명시해 주시기 바랍니다.
추가점수를 충분히 드리도록 하겠습니다. |
|
위로 |
|
|
이준
가입: 2006년 9월 7일 올린 글: 30
|
올려짐: 2006년10월27일 22:03 주제: |
|
|
한번에 이해 못하고 자꾸 물어봐서 죄송합니다만;;;
그렇다면 dissolveCbr내에서 새로운 f'를 정의하는것이 불가피하다고
이해하였습니다. ( 이 이해가 또 틀린걸까요? -_-;;;; )
맞다면! 우리가 임의의 이름 f'를 만들어야 하는데요..
이때 사용자가 f'이란 동일 이름의 함수를 직접 (다른 목적으로) 만드는 일은
없다고 가정해도 좋은건가요?
이렇게 하는거 아닌가요?;; 아웅.. 이해력이 딸리나..+_+;;;;;민망민망;; |
|
위로 |
|
|
장민석
가입: 2006년 9월 5일 올린 글: 165
|
올려짐: 2006년10월27일 23:04 주제: |
|
|
음...이준님 말씀대로, 제 생각에도 f'이란 이름이 다른 곳에서 쓰이지 않는다는 것이 보장되어야 할 것 같아요. |
|
위로 |
|
|
김주성
가입: 2006년 9월 15일 올린 글: 5
|
올려짐: 2006년10월27일 23:06 주제: f'가 상관없는 이유 |
|
|
k-의 렉서를 보시면 f'라는 함수는 사용자가 사용할 수 없는 이름이라는 것을 알 수 있습니다. |
|
위로 |
|
|
이준
가입: 2006년 9월 7일 올린 글: 30
|
올려짐: 2006년10월27일 23:27 주제: |
|
|
대..대단하십니다..+_+;
렉서를 분석하시는군요..쿠오올;; |
|
위로 |
|
|
이준희
가입: 2006년 9월 18일 올린 글: 43
|
올려짐: 2006년10월28일 0:05 주제: |
|
|
렉서에서 사용 불가능함과는 별개의 문제인것 같은데요...
f에서 f'을 새로 만든다는 것이 '을 붙이는게 아니라, call by reference를 구현하기 위한 새로운 프로시저를 만든다는 의미로 생각하고 있으니까요. 이름이 어떻게 쓰인다와는 큰 관련이 없을것 같네요.
저역시 윗분들과 마찬가지로 뒤에서 같은 함수 이름이 다시 나오지 않는다는 보장이 필요할 것 같습니다. _________________ ... |
|
위로 |
|
|
김주성
가입: 2006년 9월 15일 올린 글: 5
|
올려짐: 2006년10월28일 3:59 주제: 이준희님이 무슨 말씀이신지 잘 모르겠습니다. |
|
|
이준희님이 하시는 말씀이 무슨 말인지 잘 모르겠습니다;;
f'라는 함수를 새로 만드는데 사용자가 아미 f'라는 함수를 사용하고 있을때 문제인것 아닌가요??
program은 lexer와 parser가 만들어주는 것이니깐, 최소한 k-코드로부터 나오는 program에는 f'라는 함수가 없다고 봐도 될거 같아요.. |
|
위로 |
|
|
장민석
가입: 2006년 9월 5일 올린 글: 165
|
올려짐: 2006년10월28일 4:26 주제: |
|
|
준희님 말씀은 f'이란 단지 f가 아닌 임의의 함수명을 의미하는 것이지 꼭 f에 '을 붙여 만든 새로운 이름을 의미하는 것은 아니라는 거죠. 스펙의 원래 의도를 생각해 본다면 맞는 말씀이죠. 그러므로, 만약 우리가 dissolveCbr를 짤 때 임의의 함수명을 사용한다면 이름 중복 문제가 생길 수 있다는 말씀인 것 같아요.
그런데 주성님 말씀대로 우리가 dissolveCbr 짤 때 그냥 함수명에다 '을 붙여서 사용하면 이름 중복 문제는 없겠죠. 이렇게 하면, f'이 될 수 있는 이름의 범위를 스펙의 의도보다 제한하게 되는 셈이지만, 뭐 결과적으론 아무런 상관이 없지요. |
|
위로 |
|
|
박대준
가입: 2005년 10월 7일 올린 글: 245
|
올려짐: 2006년10월28일 20:46 주제: |
|
|
김주성 씀: | k-의 렉서를 보시면 f'라는 함수는 사용자가 사용할 수 없는 이름이라는 것을 알 수 있습니다. | lexer에서 '을 허용하지 않는다는 것은 어떤 것을 보고 말씀하시는 것인지요?
숙제 4에서 제공된 lexer를 보면, id로써 사용될 수 있는 문자열의 맨 마지막에는 ' 이 올 수 있도록 정의되어 있습니다.
이것은 K- 의미 정의 문서에서도 마찬가지입니다.
단, 이번 숙제4의 1번 문제에서는, 구현의 편의를 위하여,
변환되기 전 프로그램에 정의되는 함수의 이름에 ' 가 없다고 가정합시다.
즉, 여러분은 ' 를 붙이실 때, 기존 함수와의 중복될 염려를 하지 않으셔도 됩니다. |
|
위로 |
|
|
조은상
가입: 2006년 9월 8일 올린 글: 17
|
올려짐: 2006년10월28일 21:45 주제: |
|
|
박대준 씀: | 단, 이번 숙제4의 1번 문제에서는, 구현의 편의를 위하여,
변환되기 전 프로그램에 정의되는 함수의 이름에 ' 가 없다고 가정합시다.
즉, 여러분은 ' 를 붙이실 때, 기존 함수와의 중복될 염려를 하지 않으셔도 됩니다. |
감사합니다. |
|
위로 |
|
|
김주성
가입: 2006년 9월 15일 올린 글: 5
|
올려짐: 2006년10월29일 2:05 주제: |
|
|
아 놔;;
'\''이게 '였군요;; 잘못봤어요;; 죄송합니다; |
|
위로 |
|
|
|