프로그래밍언어론이라는 수업에서 다루는 OCaml을 정리해두고자 합니다.
개인적인 공부글이므로 틀린 부분이 있을 수 있습니다.
지적해주시면 감사...
질문해주시면 아는만큼 대답해드립니다...
Windows / WSL / utop 환경에서 OCaml을 쓰고 있습니다
OCaml: 정적 타입 언어
: 자료형이 다르면 연산이 되지 않는다. <command 2>처럼 2.0을 int_of_float를 이용하여 자료형을 통일시켜야 연산 가능.
+ 애초에 위와 같은 +, *와 같은 연산자들은 int전용 연산자라 float 계산이 안 된다...
float 연산자는 int 전용 연산자 뒤에 ' . ' 을 붙여야 함!
조건 표현식(Conditional Expressions)
if 'be' then 'e1' else 'e2' : 'be' 가 true면 'e1', false면 'e2'이다.
'be' : 조건식, 반드시 boolean 자료형이어야함.
'e1', 'e2' : 두 값의 자료형은 같아야 함.
(Names and Functions 섹션인데 변수 정의만으로 너무 길어서 둘로 자릅니다)
변수 정의(Names)
: 'let' 키워드로 전역변수를 선언할 수 있다.
: let ~ in ~ 형태로 지역변수를 선언할 수 있다.
let 'x' = 'e1' in 'e2'
'x' : e1으로 초기화됨.
'e2' : 전체 표현식의 값이 됨.
이라는데 C나 파이썬만 다루다가 와서 그런지 무슨 소리인지 모르겠어서 대충 예시로 풀어써봄.
일단, 전역변수와 지역변수는 당연하게도 다음과 같은 차이를 보입니다.
선언해두고 다른 command에서 그 값을 불러올 수 있느냐 없느냐가 큰 차이!
그리고 지역변수 선언 시 'e2' 부분을 다르게하면 이런 차이를 보입니다.
전체 표현식의 값이 된다는 말은 int = 1, int = 2와 같이 결과 출력시 나오는 값이 된다는 것으로 보입니다.
+더 찾아보니까 OCaml은 한 번 변수 값이 정해지면 그 값은 그 command 안에서 불변하며, 타 command에서도 let을 이용하지 않는 한 변하지 않는다고 합니다(아닐 시 얘기해주시길...)
그리고 in 이후의 식은 변수가 정의되는 부분에 한해서 사용된다고 합니다!
결론적으로 다음과 같은 활용이 가능하네요
함수(Functions)
다음과 같이 선언/활용이 가능(예시: 제곱함수)
함수 선언 시 body에는 어떤 자료형이든 올 수 있다. (예시: 음수면 true 반환하는 함수)
여러개의 인수를 사용할 수도 있다.
'let rec'를 이용하여 재귀적인 함수를 정의할 수도 있다.
Nameless Functions(함수명이 없는 함수)
:nameless 또는 anonymous function으로 불림
다음과 같이 선언, 사용된다.
변수를 선언하듯이 이름 없는 함수를 변수에 저장할 수 있다.
OCaml에서 함수는 First-Class이다.
프로그래밍 언어에서 value는 first-class이며, 그렇기 때문에
1. 변수에 저장된다.
2. 함수의 인자가 된다.
3. 다른 함수로부터 반환된다.
OCaml에서 함수는 first-class이기 때문에 위 세 가지 특징을 모두 가지고 있다.
+Scala, Java8, JavaScript, Python, Lisp 등의 언어에서도 함수는 위와 같은 특징을 가지고 있다.
함수를 이용하는 함수를 higher-order functions로 부른다. 이 함수는, 즉 함수를 인자로 가지거나 함수를 반환하는 함수를 의미하며, 이는 언어의 표현력을 매우 증가시킨다.
OCaml function example
1. 함수는 변수에 저장될 수 있다.
2. 함수는 다른 함수에서 인자로 활용될 수 있다.
(함수: sum_if_true, even)
3. 함수는 반환될 수 있다.
(plus_a 3이 반환된다.)
'프로그래밍 > 프로그래밍언어론' 카테고리의 다른 글
OCaml 자료형 (1) (0) | 2024.09.27 |
---|