게시판 인덱스

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

M의 memory와 environment 구조에 대하여...

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2006)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
이준희



가입: 2006년 9월 18일
올린 글: 43

올리기올려짐: 2006년11월22일 15:11    주제: M의 memory와 environment 구조에 대하여... 인용과 함께 답변

hw6을 하다보니... 주어진 뼈대에서,

코드:
type env = id -> value
type memory = int * (loc -> value)


라고 되어있는데요, 이전까지 리스트를 이용해서 구현되거나 했던 것들이 어떻게 저런 간단한 구조를 가질 수 있는지 잘 파악이 안되네요. Crying or Very sad

M의 메모리와 환경 동작방식에 대해 간단히 설명해 주실 분~ (거저먹으려고 하냐... 퍽퍽)
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
박대준



가입: 2005년 10월 7일
올린 글: 245

올리기올려짐: 2006년11월22일 23:42    주제: 인용과 함께 답변

원래는 뼈대를 이렇게 자세하게 제공할 계획이 없던지라, 환경과 메모리를 여러분이 쉽게 이해하실 구조로 제공해드리지 못했습니다.
일단, 자세한 것이 싫으신 분들은, 1.n파일의 25번째 줄에 있는 주석을 참고하시면서, 부분적으로 구현된 곳을 보시면 쉽게 사용이 가능할 것으로 보입니다.
즉,
환경 e 에 x 에 해당하는 값 v 를 넣을 경우, e @+ (x,v) 하시면 되고,
환경 e 에서 x 에 해당하는 값을 꺼내올 때는, e(x) 하시면 되고,
메모리 m 에서 l 에 해당하는 값 v 를 넣을 경우, store m (l,v) 하시면 되고,
메모리 m 에서 l 에 해당하는 값을 꺼내올 때는, fetch m l 하시면 됩니다.

위의 인터페이스만 아셔도 인터프리터를 구현하는 데에는 별 무리가 없을 것으로 보입니다.

덧붙여,
호기심이 있으신 분들을 위해 환경과 메모리 구현에 대해 간단히 설명을 드리도록 하겠습니다.

환경은 id 에서 value 로 가는 함수로 정의되어 있습니다.
환경은 어떤 id 에 어떤 value 를 넣거나, 어떤 id 가 어떤 값에 묶여 있는지만 알 수 있으면 됩니다.
특정 id 에 대해 값을 꺼내올 때는 단지 환경에 id 를 apply 시키기만 하면 됩니다. (환경 자체가 함수이기 때문에..)
문제는 id 에 대한 값을 넣는 것인데, 다음 코드가 그러한 일을 합니다.
코드:
fun (@+) f (x, v) = (fn y => if y = x then v else f y)

어떤 환경 f 에 x 에 대한 값 v 를 넣은 환경을 만들고 싶다고 합시다.
그러면 우리는 새로운 함수를 만들어야 합니다.
즉, 기존에 환경 f 에 매달려 있던 값들은 그대로 유지하면서, x 에 대한 바인딩만 v 로 바뀐 함수(환경)을 만들고 싶은 것입니다.
따라서 위 코드가 의미하는 것은, 새로운 환경은 어떤 id 를 받았을 때, 그 id 가 x 이면 v 라는 값을 리턴하고, 아니라면 기존의 환경 f 에서 꺼내오라는 것입니다.

nML은 값 중심의 언어, 함수형 언어이기 때문에, 함수값이 어떤 함수의 입력값이나 리턴값이 될 수 있습니다.
즉, (@+) 이라는 함수는 환경(함수)를 입력으로 받아서, 새로운 환경(함수)를 결과값으로 내놓는 것입니다.
결과값 환경은 입력값으로 받은 환경과 동일한 바인딩을 유지하되, x 에 대한 바인딩만 v 로 바뀐 환경이 됩니다.

메모리는 마지막으로 할당된 주소를 덧붙이고 있을 뿐, 기본적으로 환경과 동일한 구조입니다.

그리고 한가지 더,
nML에서는 특정한 기호로 이루어진 문자열을 infix 연산자로 사용자가 정의해서 사용할 수 있습니다.
즉, (@+) 를 add 라고 정의했다면, add f (x,v) 라고 사용해야 하지만,
@과 +로 이루어진 @+라는 문자열을 infix로 정의해서 f @+ (x,v) 라고 사용할 수 있습니다.
물론 (@+) f (x,v) 처럼 prefix 로 사용하셔도 무방합니다.
단, infix 일때는 괄호 없이, prefix 일때는 괄호를 친 상태로 사용하셔야 합니다.
infix 연산자에서 사용가능한 기호들에 대한 정보는 nML 언어 정의 문서 4 page의 infixid 문법 부분을 참고하시기 바랍니다.

두서없이 설명을 해서 도움이 되셨는지 모르겠습니다.

함수를 입력으로만 받는 언어를 사용하다가,
함수가 결과값이 될 수 있는 언어를 처음 접하게 되면, 잘 이해가 되지 않는게 당연합니다.
조금만 곰곰히 생각해보시면, 함수가 first class object로 사용되는 언어의 자연스러움과 오묘함(?)에 금방 익숙해지실 수 있을 것입니다.
위로
사용자 정보 보기 비밀 메시지 보내기
이준희



가입: 2006년 9월 18일
올린 글: 43

올리기올려짐: 2006년11월23일 18:08    주제: 인용과 함께 답변

답변 감사드립니다. Smile 바닐라M을 완성하면서 대충 감은 잡았었는데, 완벽하게 이해하지 못했던 부분이 답변을 통해서 다 풀렸네요.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.310 Programming Languages (Fall 2006) 시간대: GMT + 9 시간(한국)
페이지 11

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


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