Jump to content
 







Main menu
   


Navigation  



Main page
Contents
Current events
Random article
About Wikipedia
Contact us
Donate
 




Contribute  



Help
Learn to edit
Community portal
Recent changes
Upload file
 








Search  

































Create account

Log in
 









Create account
 Log in
 




Pages for logged out editors learn more  



Contributions
Talk
 



















Contents

   



(Top)
 


1 Examples  



1.1  Hello World  





1.2  Factorial function (recursion and purely functional programming)  





1.3  Numerical derivative (higher-order functions)  





1.4  Discrete wavelet transform (pattern matching)  







2 History  





3 See also  





4 References  





5 Bibliography  





6 External links  














Caml






Azərbaycanca
Español
Français
Italiano
Norsk bokmål
Norsk nynorsk
Português
Русский
Suomi
Türkçe
Українська


 

Edit links
 









Article
Talk
 

















Read
Edit
View history
 








Tools
   


Actions  



Read
Edit
View history
 




General  



What links here
Related changes
Upload file
Special pages
Permanent link
Page information
Cite this page
Get shortened URL
Download QR code
Wikidata item
 




Print/export  



Download as PDF
Printable version
 
















Appearance
   

 






From Wikipedia, the free encyclopedia
 

(Redirected from Caml Light)

Caml
ParadigmMulti-paradigm: functional, imperative
FamilyML
Designed byGérard Huet, Guy Cousineau, Ascánder Suárez, Pierre Weis, Michel Mauny (Heavy Caml), Xavier Leroy (Caml Light)
DeveloperINRIA, ENS
First appeared1985; 39 years ago (1985)
Stable release

0.75[1] / January 26, 2002; 22 years ago (2002-01-26)

Typing disciplineinferred, static, strong
Memory managementautomatic
OSCross-platform: Unix, Linux, macOS; Windows
LicenseQPL 1, LGPL 2 (Caml Light)
Websitecaml.inria.fr
Influenced by
ML
Influenced
OCaml

Caml (originally an acronym for Categorical Abstract Machine Language) is a multi-paradigm, general-purpose, high-level, functional programming language which is a dialect of the ML programming language family. Caml was developed in France at French Institute for Research in Computer Science and Automation (INRIA) and École normale supérieure (Paris) (ENS).

Caml is statically typed, strictly evaluated, and uses automatic memory management. OCaml, the main descendant of Caml, adds many features to the language, including an object-oriented programming (object) layer.

Examples

[edit]

In the following, # represents the Caml prompt.

Hello World

[edit]

A"Hello, World!" program is:

print_endline "Hello, world!";;

Factorial function (recursion and purely functional programming)

[edit]

Many mathematical functions, such as factorial, are most naturally represented in a purely functional form. The following recursive, purely functional Caml function implements factorial:

let rec fact n = if n=0 then 1 else n * fact(n - 1);;

The function can be written equivalently using pattern matching:

let rec fact = function
  | 0 -> 1
  | n -> n * fact(n - 1);;

This latter form is the mathematical definition of factorial as a recurrence relation.

Note that the compiler inferred the type of this function to be int -> int, meaning that this function maps ints onto ints. For example, 12! is:

 # fact 12;;
 - : int = 479001600

Numerical derivative (higher-order functions)

[edit]

Since Caml is a functional programming language, it is easy to create and pass around functions in Caml programs. This ability has very many applications. Calculating the numerical derivative of a function is one example. The following Caml function d computes the numerical derivative of a given function f at a given point x:

let d delta f x =
  (f (x +. delta) -. f (x -. delta)) /. (2. *. delta);;

This function requires a small value delta. A good choice for delta is the cube root of the machine epsilon.[citation needed].

The type of the function d indicates that it maps a float onto another function with the type (float -> float) -> float -> float. This allows us to partially apply arguments. This functional style is known as currying. In this case, it is useful to partially apply the first argument deltatod, to obtain a more specialised function:

# let d = d (sqrt epsilon_float);;
val d : (float -> float) -> float -> float = <fun>

Note that the inferred type indicates that the replacement d is expecting a function with the type float -> float as its first argument. We can compute a numerical approximation to the derivative of at with:

# d (fun x -> x *. x *. x -. x -. 1.) 3.;;
- : float = 26.

The correct answer is .

The function d is called a "higher-order function" because it accepts another function (f) as an argument. Going further can create the (approximate) derivative of f, by applying d while omitting the x argument:

# let f' = d (fun x -> x *. x *. x -. x -. 1.) ;;
val f' : float -> float = <fun>

The concepts of curried and higher-order functions are clearly useful in mathematical programs. These concepts are equally applicable to most other forms of programming and can be used to factor code much more aggressively, resulting in shorter programs and fewer bugs.

Discrete wavelet transform (pattern matching)

[edit]

The 1D Haar wavelet transform of an integer-power-of-two-length list of numbers can be implemented very succinctly in Caml and is an excellent example of the use of pattern matching over lists, taking pairs of elements (h1 and h2) off the front and storing their sums and differences on the lists s and d, respectively:

# let haar l =
   let rec aux l s d = 
     match l, s, d with
       [s], [], d -> s :: d
     | [], s, d -> aux s [] d
     | h1 :: h2 :: t, s, d -> aux t (h1 + h2 :: s) (h1 - h2 :: d)
     | _ -> invalid_arg "haar" 
     in aux l [] [];;
val haar : int list -> int list = <fun>

For example:

  # haar [1; 2; 3; 4; -4; -3; -2; -1];;
   - : int list = [0; 20; 4; 4; -1; -1; -1; -1]

Pattern matching allows complicated transformations to be represented clearly and succinctly. Moreover, the Caml compiler turns pattern matches into very efficient code, at times resulting in programs that are shorter and faster than equivalent code written with a case statement (Cardelli 1984, p. 210.).

History

[edit]

The first Caml implementation was written in Lisp by Ascánder Suárez in 1987 at the French Institute for Research in Computer Science and Automation (INRIA).[2]

Its successor, Caml Light, was implemented in CbyXavier Leroy and Damien Doligez,[2] and the original was nicknamed "Heavy Caml" because of its higher memory and CPU requirements.[2]

Caml Special Light was a further complete rewrite that added a powerful module system to the core language. It was augmented with an object-oriented programming (object) layer to become Objective Caml, eventually renamed OCaml.

See also

[edit]

References

[edit]
  1. ^ "Latest Caml Light release". Retrieved 22 February 2020.
  • ^ a b c "A History of Caml", inria.fr
  • Bibliography

    [edit]
    [edit]
    Retrieved from "https://en.wikipedia.org/w/index.php?title=Caml&oldid=1224273236"

    Categories: 
    Programming languages
    High-level programming languages
    Functional languages
    ML programming language family
    Programming languages created in 1985
    Hidden categories: 
    Articles with short description
    Short description is different from Wikidata
    Use dmy dates from April 2024
    Articles with example OCaml code
    All articles with unsourced statements
    Articles with unsourced statements from May 2008
    Webarchive template wayback links
    Official website different in Wikidata and Wikipedia
     



    This page was last edited on 17 May 2024, at 10:03 (UTC).

    Text is available under the Creative Commons Attribution-ShareAlike License 4.0; additional terms may apply. By using this site, you agree to the Terms of Use and Privacy Policy. Wikipedia® is a registered trademark of the Wikimedia Foundation, Inc., a non-profit organization.



    Privacy policy

    About Wikipedia

    Disclaimers

    Contact Wikipedia

    Code of Conduct

    Developers

    Statistics

    Cookie statement

    Mobile view



    Wikimedia Foundation
    Powered by MediaWiki