충남대학교 컴퓨터공학과 이성호 교수님의 "프로그래밍 언어 개론" 강의를 필기한 내용입니다.
다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.
들어가기에 앞서
- OCaml은 점유율 낮은 언어인것은 맞다.
- 하지만 지독하게 매니악한 극한의 함수형 언어란 것임에는 이견이 없는거같다
- 한번 배워놓으면 다른 언어에서의 함수형 기능을 좀 원활하게 습득할 수 있지 않을까 싶다
OCaml
- 함수형 언어
- Strongly typed language : 정적 자료형 선언
- 하지만 자료형 추론기능을 제공하므로 타입을 써주지 않아도 됨. 단, 동적선언이 아니므로 자료형 미스매치의 경우 오류가 난다
- Polimorphism : 기억안나제?
- Pattern matching : 아직 뭔지 모르겠음
- Module system : 모듈기능 제공
- OOP : 객체기능을 사용할 수 있다
자료형
- () : unit. void와 같은 기능이다
- 모든 자료형은 원시타입이다. 객체타입이 아니다
- 실수의 사칙연산은 반드시 기호 옆에 .를 붙여줘야 한다
- 예를들어 +연산은 +.이다
- 문자열 연산
- ^ : 문자열 이어붙이기
- “문자열”.[인덱스] : 인덱스 접근
- String.length “문자열” : 길이구하기
- String.sub “문자열” 2 3 : 슬라이싱
- 주의할 논리연산자
- x = y, x <> y : 값비교 연산자
- x == y, x != y : 값, 주소비교 연산자
- =가 할당연산자가 아니라는것에 유의해라
컴파일
- Dune 파일 고치고
- 커맨드에 이걸 친다
dune exec --profile release ./file.exe
화면 입출력
- 화면 출력
Format.printf 출력할거
- 화면 입력
let x = read_line() in
함수호출
- 호출시 인자를 넣어줄때 괄호를 쓰지 않고 띄어쓰기로 대체한다
- 인자들을 구분하는것도 띄어쓰기를 이용한다
func(a, b)
→func a b
- 오캠엘에서의 함수는 무적권 값을 반환해야 한다 : 아무것도 반환할게 없으면 ()을 반환하면 된다
- ()는 unit이라는 값으로 void와 의미는 동일하지만 어떤 ‘값’이라는 점에서 차이점을 가진다
변수 선언, 초기화
let 변수 = 값 in
- 일반적인 언어처럼 = 로 할당하는게 아닌
let = in
이라는 구문을 써야 한다 - 모든 변수는 선언과 함께 초기화가 이루어져야 한다
- scope는 변수의 사용 범위를 나타내며 in이 그 역할을 한다 - in을 사용하면 로컬, 사용안하면 글로벌
- OCaml에서는 모든 변수가 불변으로 선언됨
- x에 1을 넣고 나중에 2를 넣으면 변수 x에 2를 넣는게 아니라 변수x를 새로 할당해서 2를 넣는다 - 주소값이 달라진다
시퀀스
- OCaml에서는 세미콜론(;)이 문장종료기호가 아닌 다음 문장 실행 이라는 뜻을 가진다
- 따라서 더 이상 실행할 문장이 없는 마지막 문장에는 세미콜론을 붙이지 않는다
- begin-end 구문을 이용해 명시적으로 실행방향을 정해줄 수도 있고
- in도 무적권 다음 문장이 실행되게 되므로 let-in구문을 통해 다음문장이 실행되게 해줄 수도 있다
Wildcard
- 언더바(
_
)로 사용할 수 있는 와일드카드는 아무 값이라는 의미를 가진다 - 오캠엘에서 함수나 연산에서 반환되거나 결과로 나온 값을 let-in을 통해 어딘가에 저장하지 않으면 오류가 난다(unit의 경우에는 오류가 안난다)
- 만약 함수의 반환값을 받아서 버리기 위해서는 와일드카드
_
를 사용하면 된다
함수선언
let 함수이름 = fun 매개변수 -> 리턴연산 in
let 함수이름 매개변수 = 리턴연산 in
- 두번째처럼 표현하는 것을 curried function이라고 한다
함수의 타입 표시
반환값 → 매개변수1 → 매개변수2 → ... → 마지막 매개변수
- 예를들어 int두개를 받아 float하나를 반환하는 함수의 경우 이 함수의 타입은 float → int → int 이 된다
함수의 매개변수보다 부족하게 인자를 줬을 때
- 인자가 다 매개변수에 채워지고 남은 매개변수는 그대로 남아 결과가 어떤 값이 아닌 함수가 된다 함수에 일부 인자만 전달하는 것으로 partial application이라고도 한다
튜플은 파이썬과 똑같다
- 다만 타입 기호는
*
로 한다 - 예를들어 (1, 2.34)의 경우 int * float 이 타입인 것이다
Higher order function
- 함수를 인자로 받는 함수를 의미함
let f x = f x in
- 이렇게 어떤 함수를 동적으로 실행하는것을 지원한다
- ppt예제 보면서 느낌을 기억할 것
OCaml의 경우 반복문을 지원하지 않는다
- 대신 무조건 함수를 재귀적으로 돌려 반복을 수행하게 만든다
- 단, 어떤함수를 재귀적으로 호출하려면 함수이름 앞에 rec이라는 키워드를 붙여줘야 한다
조건문은 if-then-else형태로 실행된다
if 조건 then 참결과 else 거짓결과
- 여기서 주의할 점은 참결과와 거짓결과의 자료형이 무조건 같아야 한다
함수 몸체 및 main은 하나의 expression으로 구성되어야 한다
- let-in문의 경우 사이에 들어가는 놈이나 in 다음줄을 let-in문이 다 감싸서 하나의 expression으로 취급된다
- if-then-else도 인덴트 안의 내용은 하나의 expression으로 취급된다
- begin-end나 ;을 통한 시퀀스도 하나의 expression으로 취급된다
- 이 점은 고려하여 모든놈이 하나의 expression으로 되어 있어야 하고 그렇지 않으면 오류가 난다