F# 용 소스파일 testForFor.fs 를 OCaml 용으로 수정한 것이다.
F# 언어는 if 구문, for 구문, 들여쓰기 규칙이 Python의 것과 닮았지만, OCam 언어는 (C 언어 처럼) 들여쓰기 규칙이 없다. 그 대신 구문의 끝을 한 개의 세미콜론(;)으로 끝낼지, 두 개의 세미콜론(;;)으로 끝낼지, 아니면 세미콜론을 안 붙일 것이지를 정확하게 지켜야 한다. OCam 언어는 let 으로 시작하는 구문에 세미콜론 없이 예약어 in 으로 (정의가) 계속 이어지는 구문도 많이 쓰인다.
두 개의 세미콜론(;;) 으로 끝나는 곳이 정의가 완전히 끝난 곳임을 알리는 구문이고, 한 개의 세미 콜론으로 끝나는 곳은 정의가 아직 완성 도지 않았으니 무시하라는 구문이다.
아래는 ocaml 을 실행시켜서서 (대화영 모드에서) 예약어 in 의 역할을 테스트한 내용이다.
val z : int = 2
# let x = [ 1; 2; 3 ];;
val x : int list = [1; 2; 3]
# let a = let x = 5 in let y = 7 in let z = x + y in 9 + x + y + z;;
val a : int = 33
# a;;
- : int = 33
# x;;
- : int list = [1; 2; 3]
# z;;
- : int = 2
# let a = let x = 5 in let y = 7 in let t = x + y in 9 + x + y + t;;
val a : int = 33
# a;;
- : int = 33
# z;;
- : int = 2
# t;;
Characters 0-1:
t;;
^
Error: Unbound value t
OCaml 언어는 (F# 언어 처럼) 함수형 언어기도 하고 명령형 언어이기도 하므로, 여기서는 가급적 OCaml 의 명령형 언어의 특징을 위주로 작성하였다.
- (*
- * Filename: testForFor.ml
- *
- * 이겹 for 반복문을 사용하여 19단표를 컨솔에 출력한다.
- *
- * Execute: ocaml testForFor.ml
- *
- * Or
- *
- * Compile: ocamlc -o testForFor.exe testForFor.ml
- * Execute: testForFor
- *
- * Date: 2013. 1. 27.
- *)
- let getDan dan =
- let t = Array.make 19 "" in
- for j = 0 to (19 - 1) do
- let sa = Printf.sprintf "%2d" dan in
- let sb = Printf.sprintf "%2d" (j + 1) in
- let sval = Printf.sprintf "%3d" (dan*(j + 1)) in
- t.(j) <- Printf.sprintf ("%s x %s = %s") sa sb sval
- done;
- t;; (* 리턴 값. 함수의 정의가 여기서 완전히 끝나므로 두 개의 세미콜론 *)
- (* 19단표를 모두 80컬럼 컨솔에 출력한다. *)
- let printAllNineteenDan() = (* OCaml 소스 코드에서는 (F# 소스 코드에서 처럼) 리스트 대신 배열을 사용한다. *)
- let arr = Array.make_matrix 18 19 "aa" in
- for i = 2 to (20 - 1) do
- arr.(i - 2) <- (getDan i );
- done;
- let d = [| 2; 7; 11; 16 |] in (* 각 줄단위 블럭의 첫단 *)
- let counter = [| 5; 4; 5; 4 |] in (* 각 줄단위 블럭에 속한 단의 개수 *)
- let lines = Array.make 19 "" in
- for k = 0 to ((Array.length d) - 1) do
- (* 8-바이트 길이의 한 줄씩 완성 *)
- for i = 0 to (19 - 1) do
- lines.(i) <- (arr.(d.(k)-2).(i));
- for j = 1 to (counter.(k) - 1) do
- lines.(i) <- Printf.sprintf ("%s %s") lines.(i) arr.(d.(k)-2+j).(i)
- done;
- done;
- (* 80 바이트 길이의 한 줄씩 출력 *)
- for i = 0 to (19 - 1) do
- Printf.printf "%s\n" (lines.(i))
- done;
- Printf.printf "\n";
- done;;
- printAllNineteenDan();;
컴파일:
Prompt> ocamlc -o testForFor.exe testForFor.ml
실행:
Prompt> testForFor
2 x 1 = 2 3 x 1 = 3 4 x 1 = 4 5 x 1 = 5 6 x 1 = 6
2 x 2 = 4 3 x 2 = 6 4 x 2 = 8 5 x 2 = 10 6 x 2 = 12
2 x 3 = 6 3 x 3 = 9 4 x 3 = 12 5 x 3 = 15 6 x 3 = 18
2 x 4 = 8 3 x 4 = 12 4 x 4 = 16 5 x 4 = 20 6 x 4 = 24
2 x 5 = 10 3 x 5 = 15 4 x 5 = 20 5 x 5 = 25 6 x 5 = 30
2 x 6 = 12 3 x 6 = 18 4 x 6 = 24 5 x 6 = 30 6 x 6 = 36
2 x 7 = 14 3 x 7 = 21 4 x 7 = 28 5 x 7 = 35 6 x 7 = 42
2 x 8 = 16 3 x 8 = 24 4 x 8 = 32 5 x 8 = 40 6 x 8 = 48
2 x 9 = 18 3 x 9 = 27 4 x 9 = 36 5 x 9 = 45 6 x 9 = 54
2 x 10 = 20 3 x 10 = 30 4 x 10 = 40 5 x 10 = 50 6 x 10 = 60
2 x 11 = 22 3 x 11 = 33 4 x 11 = 44 5 x 11 = 55 6 x 11 = 66
2 x 12 = 24 3 x 12 = 36 4 x 12 = 48 5 x 12 = 60 6 x 12 = 72
2 x 13 = 26 3 x 13 = 39 4 x 13 = 52 5 x 13 = 65 6 x 13 = 78
2 x 14 = 28 3 x 14 = 42 4 x 14 = 56 5 x 14 = 70 6 x 14 = 84
2 x 15 = 30 3 x 15 = 45 4 x 15 = 60 5 x 15 = 75 6 x 15 = 90
2 x 16 = 32 3 x 16 = 48 4 x 16 = 64 5 x 16 = 80 6 x 16 = 96
2 x 17 = 34 3 x 17 = 51 4 x 17 = 68 5 x 17 = 85 6 x 17 = 102
2 x 18 = 36 3 x 18 = 54 4 x 18 = 72 5 x 18 = 90 6 x 18 = 108
2 x 19 = 38 3 x 19 = 57 4 x 19 = 76 5 x 19 = 95 6 x 19 = 114
7 x 1 = 7 8 x 1 = 8 9 x 1 = 9 10 x 1 = 10
7 x 2 = 14 8 x 2 = 16 9 x 2 = 18 10 x 2 = 20
7 x 3 = 21 8 x 3 = 24 9 x 3 = 27 10 x 3 = 30
7 x 4 = 28 8 x 4 = 32 9 x 4 = 36 10 x 4 = 40
7 x 5 = 35 8 x 5 = 40 9 x 5 = 45 10 x 5 = 50
7 x 6 = 42 8 x 6 = 48 9 x 6 = 54 10 x 6 = 60
7 x 7 = 49 8 x 7 = 56 9 x 7 = 63 10 x 7 = 70
7 x 8 = 56 8 x 8 = 64 9 x 8 = 72 10 x 8 = 80
7 x 9 = 63 8 x 9 = 72 9 x 9 = 81 10 x 9 = 90
7 x 10 = 70 8 x 10 = 80 9 x 10 = 90 10 x 10 = 100
7 x 11 = 77 8 x 11 = 88 9 x 11 = 99 10 x 11 = 110
7 x 12 = 84 8 x 12 = 96 9 x 12 = 108 10 x 12 = 120
7 x 13 = 91 8 x 13 = 104 9 x 13 = 117 10 x 13 = 130
7 x 14 = 98 8 x 14 = 112 9 x 14 = 126 10 x 14 = 140
7 x 15 = 105 8 x 15 = 120 9 x 15 = 135 10 x 15 = 150
7 x 16 = 112 8 x 16 = 128 9 x 16 = 144 10 x 16 = 160
7 x 17 = 119 8 x 17 = 136 9 x 17 = 153 10 x 17 = 170
7 x 18 = 126 8 x 18 = 144 9 x 18 = 162 10 x 18 = 180
7 x 19 = 133 8 x 19 = 152 9 x 19 = 171 10 x 19 = 190
11 x 1 = 11 12 x 1 = 12 13 x 1 = 13 14 x 1 = 14 15 x 1 = 15
11 x 2 = 22 12 x 2 = 24 13 x 2 = 26 14 x 2 = 28 15 x 2 = 30
11 x 3 = 33 12 x 3 = 36 13 x 3 = 39 14 x 3 = 42 15 x 3 = 45
11 x 4 = 44 12 x 4 = 48 13 x 4 = 52 14 x 4 = 56 15 x 4 = 60
11 x 5 = 55 12 x 5 = 60 13 x 5 = 65 14 x 5 = 70 15 x 5 = 75
11 x 6 = 66 12 x 6 = 72 13 x 6 = 78 14 x 6 = 84 15 x 6 = 90
11 x 7 = 77 12 x 7 = 84 13 x 7 = 91 14 x 7 = 98 15 x 7 = 105
11 x 8 = 88 12 x 8 = 96 13 x 8 = 104 14 x 8 = 112 15 x 8 = 120
11 x 9 = 99 12 x 9 = 108 13 x 9 = 117 14 x 9 = 126 15 x 9 = 135
11 x 10 = 110 12 x 10 = 120 13 x 10 = 130 14 x 10 = 140 15 x 10 = 150
11 x 11 = 121 12 x 11 = 132 13 x 11 = 143 14 x 11 = 154 15 x 11 = 165
11 x 12 = 132 12 x 12 = 144 13 x 12 = 156 14 x 12 = 168 15 x 12 = 180
11 x 13 = 143 12 x 13 = 156 13 x 13 = 169 14 x 13 = 182 15 x 13 = 195
11 x 14 = 154 12 x 14 = 168 13 x 14 = 182 14 x 14 = 196 15 x 14 = 210
11 x 15 = 165 12 x 15 = 180 13 x 15 = 195 14 x 15 = 210 15 x 15 = 225
11 x 16 = 176 12 x 16 = 192 13 x 16 = 208 14 x 16 = 224 15 x 16 = 240
11 x 17 = 187 12 x 17 = 204 13 x 17 = 221 14 x 17 = 238 15 x 17 = 255
11 x 18 = 198 12 x 18 = 216 13 x 18 = 234 14 x 18 = 252 15 x 18 = 270
11 x 19 = 209 12 x 19 = 228 13 x 19 = 247 14 x 19 = 266 15 x 19 = 285
16 x 1 = 16 17 x 1 = 17 18 x 1 = 18 19 x 1 = 19
16 x 2 = 32 17 x 2 = 34 18 x 2 = 36 19 x 2 = 38
16 x 3 = 48 17 x 3 = 51 18 x 3 = 54 19 x 3 = 57
16 x 4 = 64 17 x 4 = 68 18 x 4 = 72 19 x 4 = 76
16 x 5 = 80 17 x 5 = 85 18 x 5 = 90 19 x 5 = 95
16 x 6 = 96 17 x 6 = 102 18 x 6 = 108 19 x 6 = 114
16 x 7 = 112 17 x 7 = 119 18 x 7 = 126 19 x 7 = 133
16 x 8 = 128 17 x 8 = 136 18 x 8 = 144 19 x 8 = 152
16 x 9 = 144 17 x 9 = 153 18 x 9 = 162 19 x 9 = 171
16 x 10 = 160 17 x 10 = 170 18 x 10 = 180 19 x 10 = 190
16 x 11 = 176 17 x 11 = 187 18 x 11 = 198 19 x 11 = 209
16 x 12 = 192 17 x 12 = 204 18 x 12 = 216 19 x 12 = 228
16 x 13 = 208 17 x 13 = 221 18 x 13 = 234 19 x 13 = 247
16 x 14 = 224 17 x 14 = 238 18 x 14 = 252 19 x 14 = 266
16 x 15 = 240 17 x 15 = 255 18 x 15 = 270 19 x 15 = 285
16 x 16 = 256 17 x 16 = 272 18 x 16 = 288 19 x 16 = 304
16 x 17 = 272 17 x 17 = 289 18 x 17 = 306 19 x 17 = 323
16 x 18 = 288 17 x 18 = 306 18 x 18 = 324 19 x 18 = 342
16 x 19 = 304 17 x 19 = 323 18 x 19 = 342 19 x 19 = 361
'프로그래밍 > OCaml' 카테고리의 다른 글
황금비율(golden ratio) 구하기 with OCaml (0) | 2013.01.27 |
---|---|
현재 시각 알아내기 for OCaml (0) | 2013.01.27 |
(최대공약수 구하기) while 반복문 없는 예제 for OCaml (0) | 2013.01.27 |
(최대공약수 구하기) while... 반복문 예제 for OCaml (0) | 2013.01.26 |
구구단 출력 예제 for OCaml (0) | 2013.01.26 |