« OCaml 初探 | Main | 中英文字間空白 »
要提 hello world 之前,首先先提一下 OCaml 的 interactive mode,就是執行 ocaml 這個執行檔所形成和使用者互動的狀態,這時可以馬上鍵入 OCaml 的 expression/phrase 來測試他的結果,和寫成程式碼,編譯出來的結果「幾乎」是一樣的,對於初接觸的人,想對 OCaml 的運作多一些瞭解,這個互動模式是個不錯的開始,因為他除了會馬上反應出結果出來,也對各種型別的轉變有所交待。
在 OCaml 互動模式裡頭的 hello world,那就太簡單了:
[edt1023@lgj ~]$ ocaml
Objective Caml version 3.09.3
# print_string "Hell, World!";;
Hell, World!- : unit = ()
#
這樣就完成了。他的傳回值其實是 unit(就是 (),等同於 C 的 void),印出的字串,是他的 side effect 所造成的。當然,print_string 並不會送出換行字元(\n),所以,可以改用 print_endline:
# print_endline "Hello, World!";; Hello, World! - : unit = () #或者,你也可以在 print_string 後另加一行 print_char '\n' 也是一樣。
再來就是看怎麼把寫成的程式碼拿來編譯成可執行檔:
(* vim:ts=2 sw=2 et hello-text.ml : Edward G.J. Lee (12/27/06) *) print_string "Hello World!"; print_char '\n';; (* 或 print_endline ();; 一行就解決了 *)這裡要說明的是,(*……*) 是註解,幾個 expression 可以組成一個 phrase, 各 expression 後以一個分號 ; 結束,一整個 phrase 則以雙分號 ;; 來結束。簡單的說,phrase 才是一個完整功能的句子,expression 只是單一的表示式(函數,functional language 是以 function 為處理單位的,連傳回的值本身也是 function),如果搞不清楚,那通通給他以雙分號結束也是可以的。
將上面的程式碼存檔成 hello-text.ml,接下來就要開始編譯。在 OCaml 有兩個編譯器,一個是 bytecode compiler,編譯出來的可執行檔,檔案較小,但執行速度較慢。另一種是 native-binary compiler,這會編譯成和系統相依的原生可執行檔,檔案會大一些,但執行速度會快一點,而且,無需安裝 OCaml 就可以在同一平台上執行:
bytecode compiler: ocamlc -o hello-text hello-text.ml native-binary compiler: ocamlopt -o hello-text hello-text.ml然後就可以執行 hello-text 這個可執行檔了,玩玩看吧!
這樣的 hello world 好像太「純潔」了一點?我們用 OCaml 內建的繪圖 module 來試看看,順便看怎麼在 OCaml 使用 module:
(*
vim:ts=2 sw=2 et
hello-graph.ml :
ocamlc graphics.cma hello-graph.ml -o hello-graph
ocamlopt graphics.cmxa hello-graph.ml -o hello-graph
Edward G.J. Lee (12/27/06)
*)
open Graphics;;
open_graph " 640x480";;
set_color red;
set_font "-*-*-*-r-*--82-*-*-*-p-*-iso8859-1";
moveto 100 200;
draw_string ("Hello World!");
print_endline "Press any key to stop...";
read_line ();;
編譯的方法已經寫在註解裡頭,這是典型使用模組(module)的方法。不使用 open,寫成以下的方式也是一樣:
Graphics.open_graph " 640x480";;
Graphics.set_color red;
Graphics.set_font "-*-*-*-r-*--82-*-*-*-p-*-iso8859-1";
Graphics.moveto 100 200;
Graphics.draw_string ("Hello World!");
print_endline "Press any key to stop...";
read_line ();;
不過,這樣會變得很煩,尤其是模組名稱很長的時候,這時也可以使用 alias 來簡化:
module Gr = Graphics;;
Gr.open_graph " 640x480";;
Gr.set_color red;
Gr.set_font "-*-*-*-r-*--82-*-*-*-p-*-iso8859-1";
Gr.moveto 100 200;
Gr.draw_string ("Hello World!");
print_endline "Press any key to stop...";
read_line ();;
以下是執行結果(這是在 FreeBSD X Window 編譯、執行的,所以是依 X 的取字方式):
Hello World 的来源是 Brian Kernighan, Dennis Ritchie 的 The C Programming Language.
| « | 三月 2010 | » | ||||
|---|---|---|---|---|---|---|
| 一 | 二 | 三 | 四 | 五 | 六 | 日 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 8 | 9 | 10 | 11 | 12 | 13 | 14 |
| 15 | 16 | 17 | 18 | 19 | 20 | 21 |
| 22 | 23 | 24 | 25 | 26 | 27 | 28 |
| 29 | 30 | 31 | ||||