게시판 인덱스

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

nML tips

 
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008)
이전 주제 보기 :: 다음 주제 보기  
글쓴이 메시지
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년11월30일 13:07    주제: nML tips 인용과 함께 답변

이 쓰레드에는,
nML 프로그래밍을 하다가 만나는 어려움에 대한 대처방안이
답글로 달릴 것입니다.[/u]
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년11월30일 13:13    주제: Mutual Recursive Function 인용과 함께 답변

Mutual Recursive Function

프로그램을 짜다 보면 함수 f1과 f2에서 서로를 부르면서 재귀적으로 작동하게 만들고 싶을 때가 있습니다.

스킴에의 함수는 자기 부모 Scope 전체를 볼 수 있어서 이런 함수를 자연스럽게 만들 수 있지만,
ML에서의 함수는 자기보다 먼저 선언된 이름만 참조할 수 있어서 이런 함수를 짜는 것이 불가능합니다.

그럴 때 사용하는 keyword로 and가 있습니다.

코드:

fun f1 arg = ....
and f2 arg = .....


이렇게 하면, f1에서 f2를 볼 수 있고 f2에서는 f1을 볼 수 있습니다.
타입을 정의할 때도 이런 방법을 써서 상호의존적인 타입을 만들 수 있습니다.
출석대체 과제로 나왔던 "모빌"문제를 볼까요?

코드:
type mobile = Model of int | Mobile of branch * branch
and branch= Branch of mobile



p.s
and가 이런 의미로 사용되고 있어서
boolean연산을 할 때는 andalso 와 orelse라는 키워드를 씁니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년11월30일 13:31    주제: val, val rec, fun, let 인용과 함께 답변

nML프로그램은 "선언"의 집합으로 구성됩니다.
top 레벨에서 보면 타입선언, 함수선언, 변수선언이 프로그램의 전부입니다.
선언문을 실행하다가 Side Effect로 뭔가 계산을 해 나가는 것이죠.

1. [let] vs [val, val rec, fun]
val, val rec, fun 은 전수 선언문입니다.
그에 반해 let 은 계산식입니다.
let이 어떻게 쓰이는지 생각해볼까요?

코드:
val a = let .... in *** end


let의 의미는 ***를 계산하는데, 그 때 환경에 ...의 내용을 더해서 계산하라는 뜻입니다.
실행 경과 "값"이 나오죠.

2. val vs val rec
val은 모든 종류의 값을 담을 수 있습니다.
반면 val rec은 함수만을 담을 수 있습니다.

val 이 정의하는 이름이 자신을 정의하기 위해 자신을 필요로 한다면, val로 처리할 수 없습니다.
val rec은 이런 "재귀적"인 경우를 처리할 때 씁니다.
그리고 프로그램에서 값이 재귀적일 수 있는 경우는 "함수" 밖에 없습니다.
fun은 val rec을 타이핑하는 수고를 덜어주기 위해 만든 설탕입니다.

코드:
fun fib x = .....
val rec fib = fn x => ...


이 두 프로그램은 같은 프로그램입니다.
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
최원태



가입: 2006년 9월 16일
올린 글: 369

올리기올려짐: 2008년11월30일 21:30    주제: 예외처리 인용과 함께 답변

예외처리

0. nML이 예외를 처리하는 방법은 기본적으론 자바와 비슷합니다.

1. 예외 정의
예외는 다음 두가지 방법으로 정의합니다.
코드:
exception <EXCEPTIONNAME>
exception <EXCEPTIONNAME> of <EXCEPTIONTYPE>

예를 들자면 다음과 같습니다.
코드:
exception UknownError
exception UserMalfunction of int * string



2. 예외 던지기
위에서 정의한 예제를 다음과 같은 방법으로 던집니다.
raise UnkownError
raise UserMalfunction (1,"유저불량")


3. 던져진 예외는 어떻게 되는가?
예외는 프로그램의 실행순서를 거꾸로 타고 올라갑니다.
가다가 handler를 만나면, handler가 예외를 잡아서 처리하고
만나지 못하면 인터프리터가 잡아서 처리합니다.
인터프리터가 예외를 처리하는 방법은 뻗어버리는 것이죠.


4. 예외 붙들기
코드:
<EXPR> handler <EXCEPTIONPATTERN> => <HANDLER EXPR>

에위를 붙는 코드는 위와 같이 생겼습니다.
handle 앞에 있는 프로그램 실행중에 예외가 발생하면,
handle 뒤에 있는 패턴매칭을 통해 에러를 잡으려 시도합니다.
만약 매칭되는 케이스가 있으면 해당 핸들러가 실행되고
매칭되지 않으면 그보다 더 상위의 핸들러를 찾아서 에러가 흘러갑니다.

코드:
(if check()
  then raise UnkownError
  else raise UserMalfunction(1,"유저불량"))
handle
  UserMalfunction(line,contents) =>
        Printf.printf "%s번째 줄에서 %s 발생!" line contents


이 코드를 보면 if 안에서 조건에 따라 두가지 에러를 발생시킵니다.
UnkownError가 난다면 위 코드에 나타난 handler가 잡지 못합니다.
반면 UserMalfunction은 handler가 잡아줍니다.

5.주의할 점1
handler 부분이 돌려주는 값은 원래 프로그램이 돌려주는 값과 타입이 같아야 합니다.

6.주의할 점2
handler 키워드 뒤에 이어지는 예외 잡기 부분과 기존에 사용하던 패턴 매칭의 생김이 비슷하여 컴파일러가 혼동하기 쉽습니다. 괄호를 잘 쓰는 지혜가 필요합니다.

코드:
//Errornous code
Sequence => expr handle Error1 => ... | Error2 => ...
|Repeat => ...

//Cured
Sequence =>  (expr handle Error1 => ... | Error2 => ...  )
| Repeat => ...
위로
사용자 정보 보기 비밀 메시지 보내기 이메일 보내기 글 올린이의 웹사이트 방문
이전 글 표시:   
이 게시판은 잠겼으므로 글을 올리거나, 답변을 하거나 수정을 할 수 없습니다   이 주제는 잠겼으므로 답변을 하거나 수정을 할 수 없습니다     게시판 인덱스 -> 4190.210 Principles of Programming (Fall 2008) 시간대: GMT + 9 시간(한국)
페이지 11

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


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