Caml(英語:Categorical Abstract Machine Language:範疇抽象機語言),是一種函數式、指令式的程式語言。最早由法國的INRIA和ENS聯合的Formel項目發展出來,是ML語言的兩種方言之一,現在主要由INRIA負責維護與發展。Caml是一種語言規範;它早期有過幾個實現,目前除了仍然活躍的OCaml,發布於2002年的Caml Light是Caml的另一個實現。
歷史
在1981年,INRIA的Gérard Huet,將最初的LCF ML適配到Multics系統的Maclisp下,並且增加了編譯器[2]。這個實現被描述於INRIA內部文檔「ML手冊」之中[3],它被開發者自稱為「Le_ML」[4]。劍橋大學的Lawrence Paulson用它開發了Cambridge LCF,而劍橋大學的Michael J. C. Gordon用它開發了第一版的HOL[5]。這個ML系統由INRIA和劍橋大學聯合維護和發行[3]。
基於Thierry Coquand在1985年的關於構造演算的論文[6],INRIA的Formel項目開始致力於參與Coq的開發。在1987年,INRIA的Ascánder Suárez,基於巴黎第七大學的Guy Cousineau的「範疇抽象機器」(CAM)[7],利用Le Lisp的運行時間系統重新實現了Le_ML,並正式命名為「Caml」[2]。
在1990年和1991年,INRIA的Xavier Leroy基於用C實現的字節碼解釋器[8],利用Damien Doligez提供的內存管理系統重新實現了Caml,並稱其為「Caml Light」[9]。在1995年,Xavier Leroy又增加了本機代碼編譯器和高層模塊系統[10],這個版本也稱為「Caml Special Light」。在1996年,INRIA的Didier Rémy和Jérôme Vouillon,向Caml Special Light增加了物件導向特徵[11],從而創建了OCaml[12]。
範例
下面的程序hello.ml
:
print_endline "Hello World!"
很多數學函數,比如階乘,可以很自然的表示為純粹的函數形式:
let rec fact n =
if n=0 then 1 else n * fact(n - 1);;
這個函數可以使用模式匹配等價的寫為:
let rec fact = function
| 0 -> 1
| n -> n * fact(n - 1);;
後者形式是階乘作為遞推關係的數學定義。
編譯器將這個函數的類型推論為int -> int
,意味著這個函數將int
映射到int
。例如,12!
:
# fact 12;;
- : int = 479001600
引用
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.