| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131 | 
							- <!doctype html>
 
- <meta charset=utf-8>
 
- <title>CodeMirror: OCaml mode</title>
 
- <link rel=stylesheet href=../../lib/codemirror.css>
 
- <link rel=stylesheet href=../../doc/docs.css>
 
- <style type=text/css>
 
-   .CodeMirror {border-top: 1px solid black; border-bottom: 1px solid black;}
 
- </style>
 
- <script src=../../lib/codemirror.js></script>
 
- <script src=../../addon/edit/matchbrackets.js></script>
 
- <script src=ocaml.js></script>
 
- <h1>CodeMirror: OCaml mode</h1>
 
- <textarea id=code>
 
- (* Summing a list of integers *)
 
- let rec sum xs =
 
-   match xs with
 
-     | []       -> 0
 
-     | x :: xs' -> x + sum xs'
 
- (* Quicksort *)
 
- let rec qsort = function
 
-    | [] -> []
 
-    | pivot :: rest ->
 
-        let is_less x = x < pivot in
 
-        let left, right = List.partition is_less rest in
 
-        qsort left @ [pivot] @ qsort right
 
- (* Fibonacci Sequence *)
 
- let rec fib_aux n a b =
 
-   match n with
 
-   | 0 -> a
 
-   | _ -> fib_aux (n - 1) (a + b) a
 
- let fib n = fib_aux n 0 1
 
- (* Birthday paradox *)
 
- let year_size = 365.
 
- let rec birthday_paradox prob people =
 
-     let prob' = (year_size -. float people) /. year_size *. prob  in
 
-     if prob' < 0.5 then
 
-         Printf.printf "answer = %d\n" (people+1)
 
-     else
 
-         birthday_paradox prob' (people+1) ;;
 
- birthday_paradox 1.0 1
 
- (* Church numerals *)
 
- let zero f x = x
 
- let succ n f x = f (n f x)
 
- let one = succ zero
 
- let two = succ (succ zero)
 
- let add n1 n2 f x = n1 f (n2 f x)
 
- let to_string n = n (fun k -> "S" ^ k) "0"
 
- let _ = to_string (add (succ two) two)
 
- (* Elementary functions *)
 
- let square x = x * x;;
 
- let rec fact x =
 
-   if x <= 1 then 1 else x * fact (x - 1);;
 
- (* Automatic memory management *)
 
- let l = 1 :: 2 :: 3 :: [];;
 
- [1; 2; 3];;
 
- 5 :: l;;
 
- (* Polymorphism: sorting lists *)
 
- let rec sort = function
 
-   | [] -> []
 
-   | x :: l -> insert x (sort l)
 
- and insert elem = function
 
-   | [] -> [elem]
 
-   | x :: l -> 
 
-       if elem < x then elem :: x :: l else x :: insert elem l;;
 
- (* Imperative features *)
 
- let add_polynom p1 p2 =
 
-   let n1 = Array.length p1
 
-   and n2 = Array.length p2 in
 
-   let result = Array.create (max n1 n2) 0 in
 
-   for i = 0 to n1 - 1 do result.(i) <- p1.(i) done;
 
-   for i = 0 to n2 - 1 do result.(i) <- result.(i) + p2.(i) done;
 
-   result;;
 
- add_polynom [| 1; 2 |] [| 1; 2; 3 |];;
 
- (* We may redefine fact using a reference cell and a for loop *)
 
- let fact n =
 
-   let result = ref 1 in
 
-   for i = 2 to n do
 
-     result := i * !result
 
-    done;
 
-    !result;;
 
- fact 5;;
 
- (* Triangle (graphics) *)
 
- let () =
 
-   ignore( Glut.init Sys.argv );
 
-   Glut.initDisplayMode ~double_buffer:true ();
 
-   ignore (Glut.createWindow ~title:"OpenGL Demo");
 
-   let angle t = 10. *. t *. t in
 
-   let render () =
 
-     GlClear.clear [ `color ];
 
-     GlMat.load_identity ();
 
-     GlMat.rotate ~angle: (angle (Sys.time ())) ~z:1. ();
 
-     GlDraw.begins `triangles;
 
-     List.iter GlDraw.vertex2 [-1., -1.; 0., 1.; 1., -1.];
 
-     GlDraw.ends ();
 
-     Glut.swapBuffers () in
 
-   GlMat.mode `modelview;
 
-   Glut.displayFunc ~cb:render;
 
-   Glut.idleFunc ~cb:(Some Glut.postRedisplay);
 
-   Glut.mainLoop ()
 
- (* A Hundred Lines of Caml - http://caml.inria.fr/about/taste.en.html *)
 
- (* OCaml page on Wikipedia - http://en.wikipedia.org/wiki/OCaml *)
 
- </textarea>
 
- <script>
 
-   var editor = CodeMirror.fromTextArea(document.getElementById('code'), {
 
-     mode: 'ocaml',
 
-     lineNumbers: true,
 
-     matchBrackets: true
 
-   });
 
- </script>
 
- <p><strong>MIME types defined:</strong> <code>text/x-ocaml</code>.</p>
 
 
  |