프로그래밍/OCaml 26

손으로 만드는 나눗셈 계산표 with OCaml

다음은 초등학교에서 배우는 나눗셈 계산표를 만들어주는 OCaml 소스 코드이다. 나눗셈 계산표를 완성하고 나서 약수, 배수 관계를 알려준다. 아래의 소스는 Python 용 소스를 F# 용 소스로 거의 일대일 변환하고,또 F# 소스를 OCaml 소스로 변환한 것이라서, OCaml 언어의 명령형 언어의 특징을 위주로 짜여져 있다. 예외상황 처리 부분 try ... with ... 부분이 아직 미완성이다. (* * Filename: makeDivisionTable.ml * * Purpose: Make a division table in a handy written form. * * Execute: ocaml makeDivisionTable.ml * * Or * * Compile: ocamlc -o makeDi..

OCaml 언어로 큰 정수(big integer) 계산하기

자리수가 매우 긴 정수(큰 정수, big integer)를 계산하려면 C/C++ 언어로는 gmp 또는 mpir 라이브러리를 쓰면 되고 Java 언어로는 java.math.BigInteger 클래스를 사용하면 되고, C# 언어로는 System.Numerics.BigInteger 클래스를 사용하면 되고, Python 언어로는 long 타입(Python 이 자체적으로 알아서 int 타입과 long 타입을 자동 변환함)을쓰면 되고, Haskell 언어로는 (Int 타입 대신) Integer 타입을 쓰면 된다. F# 언어의 경우에는 F 샤프 를 참조한다, 그렇다면 OCaml 언어로는 big integer 계산을 어떻게 할까? 답은 의외로 간단하다. 이미 lib 폴더에 설치되어 있는 라이브러리 nums.cma 를 ..

7비트 ASCII 코드표 만들기 예제 with OCaml

ASCII(애스키)란 American Standard Code for Information Interchange의 줄임글로서, 영문자에 기초한 문자 인코딩이다. 이 문자 인코딩에는 C0 제어문자(C0 control character)도 포함되어 있다. ( 참고: ASCII - Wikipedia, the free encyclopedia ) 다음은 7bit ASCII 코드표를 만들어 보여주는 OCaml 소스 코드이다. 소스 코드 중에 진법변환에 필요한 함수 atoi string radix itoa number radix 를 OCaml 코드로 자체 작성하여 사용하였다. (아래의 소스는 Python 소스를 F# 소스로 일대일 변환 수정하고, 또 F# 소스를 OCaml 소스로 바꾼 것이라서 명령형 언어 특징을 위..

OCaml 에 Extlib 설치하고 사용하는 예

Extlib 는 OCaml 에 붙여 쓰는 여러 가지 (써드 파티) 라이브러리 중의 하나이며, OCaml 의 표준 라이브러리가 지원하지 않는 일들(예를 들면 UTF8 문자 지원)을 한다. 현재 최신 버전인 Extlib 1.5.3 은 OCaml 4.00.0 과 4.00.1 용 라이브러리이고, Extlib 1.5.1, 1.5.2 는 OCaml 3.12.0, 3.12.1 용 라이브러리이다 64비트 윈도우의 경우 Extlib 가 전부 설치되지 못하고, 일부(마이트 코드영 라이브러리, 설치 과정 중 1번 선택)만 설치되는 현상이 있다. 설치하는 명령은 (Extlib 의 압축이 해제된 폴더에서) Prompt> ocaml install.ml 이다. 설치 과정 중에 모두(3번)를 선택하여 설치가 실패할 경우에는 1번(바..

진법(radix) 표 만들기 예제 with OCaml

컴퓨터 프로그래밍에서 꼭 알아두어야 할 주요 진법은 당연히 10진법, 2진법, 8진법, 16진법이다. 다음은 0 에서 15 까지의 정수를 10진법, 2진법, 8진법, 16진법의 표로 만들어 보여주는 OCaml 소스 코드이다. 진법 변환에 필요한 함수 int = atoi string radix (즉, atoi :: string -> int -> int ) string = itoa number radix (즉, itoa :: int -> int -> string ) 를 OCaml 코드로 자체 작성하여 사용하였다. (아래의 소스는 Python 소스를 F# 소스로 일대일 변환 수정하고, 또 F# 소스를 OCaml 소스로 바꾼 것이라서 명령형 언어 특징을 위주로 작성되어 있다. 그래서 함수형 언어의 관점으로 보면..

대화형 모드의 진법(radix) 변환 예제 with OCaml

다음은 대화형 모드(interactive mode)에서 진법 변환(radix conversion)하는 OCaml 소스 코드이다. 주: 이 소스는 Python 용으로 만들어 둔 소스를 F# 언어로 바꾸고, 다시 이를 Ocaml 언어로 바꾸느라 OCaml 언어의 명령형 언어 특징을 위주로 짜여져 있다. 메뉴는 주메뉴 Command: (S)et radix, (A)bout, (Q)uit or E(x)it 와 부메뉴 SubCommand: 'main()' to goto Main menu, 'exit()' or 'quit()' to exit 로 구성되어 있으며, 진법 변환의 핵심은 소스 코드에 자체 작성된 함수 atoi 와 itoa 의 사용이다. let value = atoi str srcRdx let str = i..

황금비율(golden ratio) 구하기 with OCaml

다음은 이차방정식 x^2 - x - 1 = 0 의 양의 근 즉 황금비율(golden ratio)을 구하는 OCaml 소스이다. 황금비율을 구하는 비례방정식은 1 : x = x : (x+1) 이며, 이를 이차방정식으로 표현한 것이 x^2 - x - 1 = 0 이다. See: http://en.wikipedia.org/wiki/Golden_ratio (* * Filename: testGoldenRatio.ml * 황금률(즉, 이차방정식 x^2 - x - 1 = 0 의 양의 근)을 계산한다. * * Execute: ocaml testGoldenRatio.ml * * Compile: ocamlc -o testGoldenRatio.exe testGoldenRatio.ml * Execute: testGoldenRa..

현재 시각 알아내기 for OCaml

현재 시각을 컨솔에 보여주는 간단한 OCaml 언어 소스 코드이다. UTC란 1970년 1월 1일 0시 0분 0초를 기준으로 하여 경과된 초 단위의 총 시간을 의미한다. UTC(Universal Time Coordinated, 협정세계시, 協定世界時) (* * Filename: testCTimeApp.ml * * Execute: Uncomment the line (* #load "unix.cma" ;; *) * ocaml testCTimeApp.ml * * Compile: ocamlc -g -c testCTimeApp.ml * ocamlc -o testCTimeApp.exe unix.cma testCTimeApp.cmo * Execute: testCTimeApp *) (* #load "unix.cma" ..

80컬럼 컨솔에 19단표 출력하기 예제 for OCaml

F# 용 소스파일 testForFor.fs 를 OCaml 용으로 수정한 것이다. F# 언어는 if 구문, for 구문, 들여쓰기 규칙이 Python의 것과 닮았지만, OCam 언어는 (C 언어 처럼) 들여쓰기 규칙이 없다. 그 대신 구문의 끝을 한 개의 세미콜론(;)으로 끝낼지, 두 개의 세미콜론(;;)으로 끝낼지, 아니면 세미콜론을 안 붙일 것이지를 정확하게 지켜야 한다. OCam 언어는 let 으로 시작하는 구문에 세미콜론 없이 예약어 in 으로 (정의가) 계속 이어지는 구문도 많이 쓰인다. 두 개의 세미콜론(;;) 으로 끝나는 곳이 정의가 완전히 끝난 곳임을 알리는 구문이고, 한 개의 세미 콜론으로 끝나는 곳은 정의가 아직 완성 도지 않았으니 무시하라는 구문이다. 아래는 ocaml 을 실행시켜서서 ..

(최대공약수 구하기) while 반복문 없는 예제 for OCaml

소스 파일명: TestNoWhile.ml (* * Filename: testNoWhile.ml * * Purpose: Example not using the while loop syntax * while .... * * Execute: ocaml testNoWhile.ml -200 300 * * Or * * Compile: ocamlc -o testNoWhile.exe testNoWhile.ml * Execute: testNoWhile -200 300 *) (* 사용법 표시 *) let printUsage() = Printf.printf "Using: testNoWhile.py [integer1] [integer2]\n"; Printf.printf "This finds the greatest common..