충남대학교 컴퓨터공학과 이성호 교수님의 "프로그래밍 언어 개론" 강의를 필기한 내용입니다.

다소 잘못된 내용과 구어적 표현 이 포함되어 있을 수 있습니다.

들어가기에 앞서

  • 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 : 값, 주소비교 연산자
    • =가 할당연산자가 아니라는것에 유의해라

컴파일

  1. Dune 파일 고치고
  2. 커맨드에 이걸 친다
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으로 되어 있어야 하고 그렇지 않으면 오류가 난다