<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Basiles</id>
	<title>Lea Linux - Contributions [fr]</title>
	<link rel="self" type="application/atom+xml" href="https://lea-linux.org/docs/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Basiles"/>
	<link rel="alternate" type="text/html" href="https://lea-linux.org/documentations/Sp%C3%A9cial:Contributions/Basiles"/>
	<updated>2026-04-04T11:40:50Z</updated>
	<subtitle>Contributions</subtitle>
	<generator>MediaWiki 1.40.1</generator>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11886</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11886"/>
		<updated>2006-02-19T20:07:34Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ En Construction }}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;(* hello world en Ocaml *)&lt;br /&gt;
print_string &amp;quot;hello world\n&amp;quot;;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&amp;lt;code&amp;gt;% &amp;lt;i&amp;gt;ocaml&amp;lt;/i&amp;gt;&lt;br /&gt;
  Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
#  2 + 3;;&lt;br /&gt;
- : int = 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;). L&#039;inférence de types prend tout son intérêt sur des programmes non triviaux (plus d&#039;une centaine de lignes) dont elle permet la concision (en évitant la plupart des déclarations de type, comme on le fait en C, C++, Java...).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
&amp;lt;code&amp;gt;# #use &amp;quot;hello.ml&amp;quot;;;&lt;br /&gt;
hello world&lt;br /&gt;
- : unit = ()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
&amp;lt;code&amp;gt;# print_string;;&lt;br /&gt;
- : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
&amp;lt;code&amp;gt;# let dix = 5*2;;&lt;br /&gt;
val dix : int = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
&amp;lt;code&amp;gt;# let double x = 2*x;;&lt;br /&gt;
val double : int -&amp;gt; int = &amp;amp;lt;fun&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&amp;lt;/i&amp;gt;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
# &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
- : int = 3628800&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;let rec paire n = if n = 0 then true else impaire (n-1) &lt;br /&gt;
and impaire n = if n = 0 then false else paire (n-1) ;;&amp;lt;/i&amp;gt;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;amp;lt;fun&amp;amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;amp;lt;fun&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;paire 123456789;;&amp;lt;/i&amp;gt;&lt;br /&gt;
- : bool = false&amp;lt;/code&amp;gt;&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#&#039;&amp;lt;i&amp;gt;let fact n =&lt;br /&gt;
  let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&lt;br /&gt;
  in interne_fact 1 n;;&amp;lt;/i&amp;gt;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;amp;lt;fun&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
&#039;&#039;int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle récursion terminale interne. Il faut noter que les variables dans tous les exemples ci-dessus sont des paramètres qui ne changent pas: on a rarement besoin d&#039;affectation en Ocaml.&lt;br /&gt;
&lt;br /&gt;
En fait on peut aussi coder de manière &#039;&#039;&#039;impérative&#039;&#039;&#039;, avec des variables qui varient (comme en C ou Java), qu&#039;on appelle référence:&lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;let fact n = let p = ref 1 and c = ref 1 in&lt;br /&gt;
   &#039;&#039;  while !c &amp;lt;= n do p := !p * !c  ;  incr c done; !p;; &amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
l&#039;affectation à une référence se note := et la déréference est explicitée par un point d&#039;exclamation. La fonction incr incrémente une réference vers un entier&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11885</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11885"/>
		<updated>2006-02-19T20:04:19Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ En Construction }}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&amp;lt;i&amp;gt;(* hello world en Ocaml *)&amp;lt;/i&amp;gt;&lt;br /&gt;
print_string &amp;quot;hello world\n&amp;quot;;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&amp;lt;code&amp;gt;% &amp;lt;i&amp;gt;ocaml&amp;lt;/i&amp;gt;&lt;br /&gt;
  Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
#  2 + 3;;&lt;br /&gt;
- : int = 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;). L&#039;inférence de types prend tout son intérêt sur des programmes non triviaux (plus d&#039;une centaine de lignes) dont elle permet la concision (en évitant la plupart des déclarations de type, comme on le fait en C, C++, Java...).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
&amp;lt;code&amp;gt;# #use &amp;quot;hello.ml&amp;quot;;;&lt;br /&gt;
hello world&lt;br /&gt;
- : unit = ()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
&amp;lt;code&amp;gt;# print_string;;&lt;br /&gt;
- : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
&amp;lt;code&amp;gt;# let dix = 5*2;;&lt;br /&gt;
val dix : int = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
&amp;lt;code&amp;gt;# let double x = 2*x;;&lt;br /&gt;
val double : int -&amp;gt; int = &amp;amp;lt;fun&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&amp;lt;/i&amp;gt;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
# &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
- : int = 3628800&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;let rec paire n = if n = 0 then true else impaire (n-1) &lt;br /&gt;
and impaire n = if n = 0 then false else paire (n-1) ;;&amp;lt;/i&amp;gt;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;amp;lt;fun&amp;amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;amp;lt;fun&amp;amp;gt; &amp;lt;/code&amp;gt;&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;paire 123456789;;&amp;lt;/i&amp;gt;&lt;br /&gt;
- : bool = false&amp;lt;/code&amp;gt;&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#&#039;&amp;lt;i&amp;gt;let fact n =&lt;br /&gt;
  let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&lt;br /&gt;
  in interne_fact 1 n;;&amp;lt;/i&amp;gt;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;amp;lt;fun&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
&#039;&#039;int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle récursion terminale interne. Il faut noter que les variables dans tous les exemples ci-dessus sont des paramètres qui ne changent pas: on a rarement besoin d&#039;affectation en Ocaml.&lt;br /&gt;
&lt;br /&gt;
En fait on peut aussi coder de manière &#039;&#039;&#039;impérative&#039;&#039;&#039;, avec des variables qui varient (comme en C ou Java), qu&#039;on appelle référence:&lt;br /&gt;
&amp;lt;code&amp;gt;# &amp;lt;i&amp;gt;let fact n = let p = ref 1 and c = ref 1 in&lt;br /&gt;
   &#039;&#039;  while !c &amp;lt;= n do p := !p * !c  ;  incr c done; !p;; &amp;lt;/i&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
l&#039;affectation à une référence se note := et la déréference est explicitée par un point d&#039;exclamation. La fonction incr incrémente une réference vers un entier&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11884</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11884"/>
		<updated>2006-02-19T19:59:40Z</updated>

		<summary type="html">&lt;p&gt;Basiles : /* quelques exemples de code Ocaml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ En Construction }}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;&#039;(* hello world en Ocaml *)&#039;&lt;br /&gt;
print_string &amp;quot;hello world\n&amp;quot;;;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&amp;lt;code&amp;gt;% &amp;lt;i&amp;gt;ocaml&amp;lt;/i&amp;gt;&lt;br /&gt;
  Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
#  2 + 3;;&lt;br /&gt;
- : int = 5&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;). L&#039;inférence de types prend tout son intérêt sur des programmes non triviaux (plus d&#039;une centaine de lignes) dont elle permet la concision (en évitant la plupart des déclarations de type, comme on le fait en C, C++, Java...).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
&amp;lt;code&amp;gt;# #use &amp;quot;hello.ml&amp;quot;;;&lt;br /&gt;
hello world&lt;br /&gt;
- : unit = ()&lt;br /&gt;
&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
&amp;lt;code&amp;gt;# print_string;;&lt;br /&gt;
- : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
&amp;lt;code&amp;gt;# let dix = 5*2;;&lt;br /&gt;
val dix : int = 10&amp;lt;/code&amp;gt;&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
&amp;lt;code&amp;gt;# let double x = 2*x;;&lt;br /&gt;
val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;# &#039;&#039;let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&#039;&#039;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
# &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
- : int = 3628800&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&amp;lt;code&amp;gt;# &#039;&#039;let rec paire n = if n = 0 then true else impaire (n-1) &#039;&#039; &lt;br /&gt;
&#039;&#039;and impaire n = if n = 0 then false else paire (n-1) ;;&#039;&#039;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
&amp;lt;code&amp;gt;# &#039;&#039;paire 123456789;;&#039;&#039;&lt;br /&gt;
- : bool = false&amp;lt;/code&amp;gt;&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#&#039;&#039; let fact n = &#039;&#039;&lt;br /&gt;
  &#039;&#039;let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&#039;&#039;&lt;br /&gt;
  &#039;&#039;in interne_fact 1 n;;&#039;&#039;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
&#039;&#039;int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle récursion terminale interne. Il faut noter que les variables dans tous les exemples ci-dessus sont des paramètres qui ne changent pas: on a rarement besoin d&#039;affectation en Ocaml.&lt;br /&gt;
&lt;br /&gt;
En fait on peut aussi coder de manière &#039;&#039;&#039;impérative&#039;&#039;&#039;, avec des variables qui varient (comme en C ou Java), qu&#039;on appelle référence:&lt;br /&gt;
&amp;lt;code&amp;gt;# &#039;&#039;let fact n = let p = ref 1 and c = ref 1 in&#039;&#039;&lt;br /&gt;
   &#039;&#039;  while !c &amp;lt;= n do p := !p * !c  ;  incr c done; !p;; &#039;&#039;&amp;lt;/code&amp;gt;&lt;br /&gt;
l&#039;affectation à une référence se note := et la déréference est explicitée par un point d&#039;exclamation. La fonction incr incrémente une réference vers un entier&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11870</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11870"/>
		<updated>2006-02-19T08:56:54Z</updated>

		<summary type="html">&lt;p&gt;Basiles : ajout d&amp;#039;exemples (incomplet)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;). L&#039;inférence de types prend tout son intérêt sur des programmes non triviaux (plus d&#039;une centaine de lignes) dont elle permet la concision (en évitant la plupart des déclarations de type, comme on le fait en C, C++, Java...).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&#039;&#039;&lt;br /&gt;
    val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
    # &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
    - : int = 3628800&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec paire n = if n = 0 then true else impaire (n-1) &#039;&#039; &lt;br /&gt;
      &#039;&#039;and impaire n = if n = 0 then false else paire (n-1) ;;&#039;&#039;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
    # &#039;&#039;paire 123456789;;&#039;&#039;&lt;br /&gt;
    - : bool = false&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
    #&#039;&#039; let fact n = &#039;&#039;&lt;br /&gt;
           &#039;&#039;let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&#039;&#039;&lt;br /&gt;
           &#039;&#039;in interne_fact 1 n;;&#039;&#039;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
&#039;&#039;int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle récursion terminale interne. Il faut noter que les variables dans tous les exemples ci-dessus sont des paramètres qui ne changent pas: on a rarement besoin d&#039;affectation en Ocaml.&lt;br /&gt;
&lt;br /&gt;
En fait on peut aussi coder de manière &#039;&#039;&#039;impérative&#039;&#039;&#039;, avec des variables qui varient (comme en C ou Java), qu&#039;on appelle référence:&lt;br /&gt;
    # &#039;&#039;let fact n = let p = ref 1 and c = ref 1 in&#039;&#039;&lt;br /&gt;
        &#039;&#039;  while !c &amp;lt;= n do p := !p * !c  ;  incr c done; !p;; &#039;&#039;&lt;br /&gt;
l&#039;affectation à une référence se note := et la déréference est explicitée par un point d&#039;exclamation. La fonction incr incrémente une réference vers un entier&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11867</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11867"/>
		<updated>2006-02-18T21:59:10Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;). L&#039;inférence de types prend tout son intérêt sur des programmes non triviaux (plus d&#039;une centaine de lignes) dont elle permet la concision (en évitant la plupart des déclarations de type, comme on le fait en C, C++, Java...).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&#039;&#039;&lt;br /&gt;
    val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
    # &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
    - : int = 3628800&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec paire n = if n = 0 then true else impaire (n-1) &#039;&#039; &lt;br /&gt;
      &#039;&#039;and impaire n = if n = 0 then false else paire (n-1) ;;&#039;&#039;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
    # &#039;&#039;paire 123456789;;&#039;&#039;&lt;br /&gt;
    - : bool = false&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
    #&#039;&#039; let fact n = &#039;&#039;&lt;br /&gt;
           &#039;&#039;let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&#039;&#039;&lt;br /&gt;
           &#039;&#039;in interne_fact 1 n;;&#039;&#039;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
&#039;&#039;int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle récursion terminale interne. Il faut noter que les variables dans tous les exemples ci-dessus sont des paramètres qui ne changent pas: on a rarement besoin d&#039;affectation en Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11866</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11866"/>
		<updated>2006-02-18T21:53:53Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&#039;&#039;&lt;br /&gt;
    val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
    # &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
    - : int = 3628800&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec paire n = if n = 0 then true else impaire (n-1) &#039;&#039; &lt;br /&gt;
      &#039;&#039;and impaire n = if n = 0 then false else paire (n-1) ;;&#039;&#039;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
    # &#039;&#039;paire 123456789;;&#039;&#039;&lt;br /&gt;
    - : bool = false&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
    #&#039;&#039; let fact n = &#039;&#039;&lt;br /&gt;
           &#039;&#039;let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&#039;&#039;&lt;br /&gt;
           &#039;&#039;in interne_fact 1 n;;&#039;&#039;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
&#039;&#039;int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle récursion terminale interne. Il faut noter que les variables dans tous les exemples ci-dessus sont des paramètres qui ne changent pas: on a rarement besoin d&#039;affectation en Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11865</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11865"/>
		<updated>2006-02-18T21:49:38Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici]  et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
    # let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&lt;br /&gt;
    val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
    # &#039;&#039;fact 10;;&#039;&#039;&lt;br /&gt;
    - : int = 3628800&lt;br /&gt;
&lt;br /&gt;
Voici l&#039;une des plus simples des recursivités croisées (le mot-clé and lie plusieurs définitions) - les fonctions paire et impaire&lt;br /&gt;
&lt;br /&gt;
    # &#039;&#039;let rec paire n = if n = 0 then true else impaire (n-1)  &lt;br /&gt;
      and impaire n = if n = 0 then false else paire (n-1) ;;&#039;&#039;&lt;br /&gt;
val paire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
val impaire : int -&amp;gt; bool = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
le compilateur tient compte du fait que ces recursions sont terminales; l&#039;appel recursif à impaire dans la définition de pair (et réciproquement) est la dernière application de fonction, et il est interprété itérativement (sans grossir la pile des appels). On peut donc calculer &lt;br /&gt;
    # &#039;&#039;paire 123456789;;&#039;&#039;&lt;br /&gt;
    - : bool = false&lt;br /&gt;
le résultat est calculé en quelques secondes, la machine a bouclé plus d&#039;un milliard de fois. Les compilateurs classiques (par exemple C, C++, Java) aurait fait exploser la pile d&#039;appel.&lt;br /&gt;
&lt;br /&gt;
En fait on peut réécrire la factorielle de manière récursive terminale en définissant une fonction interne à 2 arguments: le résultat partiel (produit précédemment calculé p) et l&#039;argument n&lt;br /&gt;
&lt;br /&gt;
    #&#039;&#039; let fact n = &lt;br /&gt;
       let rec interne_fact p n = if n &amp;lt; 1 then p else interne_fact (p*n) (n-1)&lt;br /&gt;
       in interne_fact 1 n;;&#039;&#039;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
On peut dans une expression définir des noms &#039;&#039;&#039;internes&#039;&#039;&#039; par la construction let .&#039;&#039;..définitions internes...&#039;&#039; in &#039;&#039;....corps.....&#039;&#039; (ou let rec ... in .... pour une recursion).&lt;br /&gt;
&lt;br /&gt;
la factorielle ainsi redefinie est compilée en du code identique à la fonction C&lt;br /&gt;
int factc(int n) { int p=1; while(n&amp;gt;1) p=p*(n--);return p; }&lt;br /&gt;
&lt;br /&gt;
La plupart des boucles s&#039;écrivent en fait par une telle recursion terminale interne.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(((à suivre)))&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11864</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11864"/>
		<updated>2006-02-18T21:32:48Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039; - voici l&#039;inévitable factorielle et le calcul de 10!&lt;br /&gt;
&lt;br /&gt;
    # let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&lt;br /&gt;
    val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11863</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11863"/>
		<updated>2006-02-18T21:25:56Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
    # let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&lt;br /&gt;
    val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11862</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11862"/>
		<updated>2006-02-18T21:24:53Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé &#039;&#039;&#039;let&#039;&#039;&#039;. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; son résultat est entier, car c&#039;est le résultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
On peut définir des fonctions récursives par la construction &#039;&#039;&#039;let rec&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# let rec fact n = if n &amp;lt; 1 then 1 else n * fact (n-1);;&lt;br /&gt;
val fact : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11861</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11861"/>
		<updated>2006-02-18T21:19:30Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt; fun &amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé let. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt; fun &amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; sont résultat est entier, car c&#039;est le resultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11860</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11860"/>
		<updated>2006-02-18T21:18:25Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé let. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs fonctionnelles (c&#039;est à dire des fonctions) par exemple&lt;br /&gt;
    # &#039;&#039;let double x = 2*x;;&#039;&#039;&lt;br /&gt;
    val double : int -&amp;gt; int = &amp;lt;fun&amp;gt;&lt;br /&gt;
Le compilateur a inféré le type de la fonction double: son argument x est nécessairement entier, car il est multiplié par 2 et que la multiplication est une opération sur les entiers; sont résultat est entier, car c&#039;est le resultat produit par la multiplication. Une fois compilé par ocamlopt, la fonction ci-dessus est aussi efficace que celle écrite en C!&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11859</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11859"/>
		<updated>2006-02-18T21:13:15Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur (la seule du type unit) est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
On peut définir des valeurs par le mot-clé let. Par exemple&lt;br /&gt;
    # &#039;&#039;let dix = 5*2;;&#039;&#039;&lt;br /&gt;
    val dix : int = 10&lt;br /&gt;
définit une valeur nommée dix de type int valant 10&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11858</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11858"/>
		<updated>2006-02-18T21:08:24Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant); l&#039;interprète interactif compile chaque phrase tapée en du code octet, puis l&#039;execute. Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués. Ce fichier peut-être édité (par exemple avec Emacs ou Xemacs en mode tuareg) puis sauvegardé dans hello.ml&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir explicitement l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase. Les entrées de l&#039;utilisateur sont ici en italiques; tout le reste (y compris le % et le #) sont sortis par la machine.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
Ici apparait un trait essentiel du langage Ocaml: l&#039;&#039;&#039;&#039;inférence de types&#039;&#039;&#039; (ou synthèse de type). Chaque expression entrée (ou compilée) est analysée par le compilateur qui devine (infère) son type. Le compilateur donne le type inféré (ici le type entier &#039;&#039;int&#039;&#039; sur 31 bits -un bit de moins que la taille du mot machine), calcule la valeur de l&#039;expression, puis l&#039;imprime (ici &#039;&#039;5&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Sous le toplevel, on peut demander la compilation (interactive) d&#039;un fichier, par la directive #use:&lt;br /&gt;
   # &#039;&#039;#use &amp;quot;hello.ml&amp;quot;;;&#039;&#039;&lt;br /&gt;
    hello world&lt;br /&gt;
    - : unit = ()&lt;br /&gt;
&lt;br /&gt;
le fichier hello.ml a été compilé puis exécuté, donc le message hello word est imprimé. Toutes les expressions Ocaml ont une valeur (à l&#039;inverse de C ou Pascal, où procedures et fonctions sont différentes), et les fonctions qui n&#039;ont qu&#039;un effet de bord (par exemple une impression) renvoie une valeur de type &#039;&#039;unit&#039;&#039; - cette valeur est notée ()&lt;br /&gt;
&lt;br /&gt;
les fonctions sont des valeurs comme les autres: Ocaml est un langage fonctionnel, et des fonctions peuvent prendre comme arguments ou renvoyer comme résultat d&#039;autres fonctions. Pour interroger le type d&#039;une valeur, il suffit de la taper; voici comment demander la fonction print_string:&lt;br /&gt;
    # &#039;&#039;print_string;;&#039;&#039;&lt;br /&gt;
    - : string -&amp;gt; unit = &amp;lt;fun&amp;gt;&lt;br /&gt;
&lt;br /&gt;
La valeur d&#039;une fonction n&#039;est pas affichée (c&#039;est techniquement une fermeture, c&#039;est à dire la juxtaposition de code executable et des valeurs qu&#039;il utilise); Ocaml affiche donc le type  string -&amp;gt; unit de la fonction print_string: c&#039;est une fonction qui prend un argument chaine et renvoie unit.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11857</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11857"/>
		<updated>2006-02-18T20:47:22Z</updated>

		<summary type="html">&lt;p&gt;Basiles : &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant). Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
=== quelques exemples de code Ocaml ===&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *) et peuvent être imbriqués.&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
on peut aussi utiliser l&#039;interprète interactif (toplevel); on peu taper les phrases sur plusieurs lignes, mais le double point-virgule est indispensable pour terminer la phrase.&lt;br /&gt;
&lt;br /&gt;
     % &#039;&#039;ocaml&#039;&#039;&lt;br /&gt;
            Objective Caml version 3.09.1&lt;br /&gt;
&lt;br /&gt;
    #  &#039;&#039;2 + 3;;&#039;&#039;&lt;br /&gt;
    - : int = 5&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11856</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11856"/>
		<updated>2006-02-18T20:41:39Z</updated>

		<summary type="html">&lt;p&gt;Basiles : n&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant). Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
== quelques exemples de code Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
      &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
       print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *)&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction, sans parenthèses. Un certain nombre de fonctions (en fait de valeurs fonctionnelles) sont prédéfinies, de sorte qu&#039;on n&#039;a pas besoin (au contraire de C) de requérir l&#039;accès à la bibliothèque standard d&#039;Ocaml.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11855</id>
		<title>OCaml</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=OCaml&amp;diff=11855"/>
		<updated>2006-02-18T20:35:11Z</updated>

		<summary type="html">&lt;p&gt;Basiles : /* L&amp;#039;implémentation d&amp;#039;Ocaml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{En construction}}&lt;br /&gt;
= Le language Ocaml =&lt;br /&gt;
&lt;br /&gt;
== Introduction ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant). Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
== quelques exemples de code Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Bien sûr, le hello world:&lt;br /&gt;
&lt;br /&gt;
  &#039;&#039;(* hello world en Ocaml *)&#039;&#039;&lt;br /&gt;
  print_string &amp;quot;hello world\n&amp;quot;;;&lt;br /&gt;
&lt;br /&gt;
Les commentaires sont à la Pascal entre (* et *)&lt;br /&gt;
&lt;br /&gt;
Les arguments d&#039;une fonction (ici print_string) suivent le nom de la fonction&lt;br /&gt;
&lt;br /&gt;
On peut sauvegarder ce fichier de 2 lignes dans hello.ml puis le compiler par &lt;br /&gt;
ocamlc hello.ml -o hello qui produit un binaire de code octet (portable tel quel sur beaucoup d&#039;architectures). On aurait pu le compiler avec le compilateur natif: ocamlopt hello.ml -o hello&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{Copy|9/11/2005|[[Utilisateur:Basiles|Basiles]]|CC-BY-SA}}&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10557</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10557"/>
		<updated>2005-11-09T20:54:46Z</updated>

		<summary type="html">&lt;p&gt;Basiles : /* Le language Ocaml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous même désirez créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&lt;br /&gt;
&lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
* [[Utilisation des jukebox creative sous linux]]  [[Utilisateur:Bimon]] 30 octobre 2005&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
[[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
:Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le language Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== L&#039;implémentation d&#039;Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant). Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot).&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
Il existe une communauté grandissante de développeurs Ocaml. Le &#039;&#039;&#039;Ocaml Hump&#039;&#039;&#039; [http://caml.inria.fr/cgi-bin/hump.fr.cgi ici] contient une collection croissante de logiciels et bibliothèques libres codé(e)s en Ocaml; on peut développer des applications Web (avec Wdialog par exemple), interfacer des SGBDs, invoquer des appels systèmes etc... Ocaml est très puissant (et originellement développé) pour le traitement symbolique de l&#039;information: compilateurs, démonstrateurs de théorèmes, etc..&lt;br /&gt;
&lt;br /&gt;
J&#039;aurais d&#039;autres choses à dire sur Ocaml. N&#039;hesitez pas à m&#039;y inciter. &lt;br /&gt;
--[[Utilisateur:Basiles|Basiles]] 9 nov 2005 à 21:45 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10556</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10556"/>
		<updated>2005-11-09T20:48:11Z</updated>

		<summary type="html">&lt;p&gt;Basiles : /* Le language Ocaml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous même désirez créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&lt;br /&gt;
&lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
* [[Utilisation des jukebox creative sous linux]]  [[Utilisateur:Bimon]] 30 octobre 2005&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
[[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
:Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le language Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
Le language caml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant). Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot.&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
J&#039;aurais d&#039;autres choses à dire sur Ocaml. N&#039;hesitez pas à m&#039;y inciter. &lt;br /&gt;
--[[Utilisateur:Basiles|Basiles]] 9 nov 2005 à 21:45 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10555</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10555"/>
		<updated>2005-11-09T20:45:41Z</updated>

		<summary type="html">&lt;p&gt;Basiles : /* Le language Ocaml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous même désirez créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&lt;br /&gt;
&lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
* [[Utilisation des jukebox creative sous linux]]  [[Utilisateur:Bimon]] 30 octobre 2005&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
[[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
:Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le language Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application libre potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes, disponible [http://www.cis.upenn.edu/~bcpierce/unison/ ici]. Il y aussi &#039;&#039;&#039;Advi&#039;&#039;&#039; (visualiseur pour fichiers dvi produits par LaTeX) qui permet notamment de faire de beaux transparents (y compris avec des formules de mathématiques, de l&#039;animation, des fenêtres de démo de logiciels) disponible [http://pauillac.inria.fr/advi/ ici] et le paquet Whizzytex (utilisant advi) pour visualiser immédiatement en temps quasi réel un document LaTeX pendant son édition.&lt;br /&gt;
&lt;br /&gt;
Le language caml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation (partageant du code en commun):&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant). Il y a aussi un débogueur &#039;&#039;&#039;ocamldebug&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot.&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;. Les programmes compilés avec ocamlopt s&#039;exécutent à peu près aussi rapidement que leur équivalent C ou C++.&lt;br /&gt;
&lt;br /&gt;
J&#039;aurais d&#039;autres choses à dire sur Ocaml. N&#039;hesitez pas à m&#039;y inciter. &lt;br /&gt;
--[[Utilisateur:Basiles|Basiles]] 9 nov 2005 à 21:45 (CET)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10554</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10554"/>
		<updated>2005-11-09T20:38:29Z</updated>

		<summary type="html">&lt;p&gt;Basiles : /* Le language Ocaml */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous même désirez créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&lt;br /&gt;
&lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
* [[Utilisation des jukebox creative sous linux]]  [[Utilisateur:Bimon]] 30 octobre 2005&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
[[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
:Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le language Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python). Il existe plusieurs grosses applications développées en Ocaml -aussi bien libres que propriétaires-. Une application potentiellement utile à beaucoup est &#039;&#039;&#039;Unison&#039;&#039;&#039; pour synchroniser (càd copier) des fichiers entres machines différentes. &lt;br /&gt;
&lt;br /&gt;
Le language caml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation:&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;, par la commande &#039;&#039;&#039;ocaml&#039;&#039;&#039;; le principal intérêt d&#039; &#039;&#039;&#039;ocaml&#039;&#039;&#039; est de tester &#039;&#039;&#039;interactivement&#039;&#039;&#039; une (ou quelques) nouvelles fonctions (éventuellement rajoutées à un gros programme existant).&lt;br /&gt;
&lt;br /&gt;
le compilateur vers du code-octet &#039;&#039;bytecode compiler&#039;, par la commande &#039;&#039;&#039;ocamlc&#039;&#039;&#039; (le code-octet produit a sa machine virtuelle propre &#039;&#039;&#039;ocamlrun&#039;&#039;&#039;; ce code octet est différent de ceux de Java, Lua ou Parrot.&lt;br /&gt;
&lt;br /&gt;
le compilateur natif (sur AMD64, x86, PowerPC, Sparc etc...) &#039;&#039;native compiler&#039;&#039;, par la commande &#039;&#039;&#039;ocamlopt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10553</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10553"/>
		<updated>2005-11-09T20:32:17Z</updated>

		<summary type="html">&lt;p&gt;Basiles : Développer en Ocaml&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous même désirez créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&lt;br /&gt;
&lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
* [[Utilisation des jukebox creative sous linux]]  [[Utilisateur:Bimon]] 30 octobre 2005&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
[[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
:Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le language Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux et au logiciel libre. Il est utilisé par une communauté croissante, aussi bien dans le monde académique (de nombreux chercheurs prototypent leurs idées en Ocaml) ou universitaire (son prédécesseur Caml est enseigné en classe prépa, premier cycle) que dans le monde industriel (dans des petites startup comme dans des grosses multinationales). Ocaml est language fonctionnel et à objets, avec un typage statique (et inférence de types). À cet égard il est assez différent des languages habituels sous Linux (comme C, C++, Perl, Python).&lt;br /&gt;
&lt;br /&gt;
Le language caml a sa page  [http://caml.inria.fr ici]. Son implémentation est libre. Il y a en réalité plusieurs variantes d&#039;implementation:&lt;br /&gt;
&lt;br /&gt;
l&#039;interprète interactif dit &#039;&#039;toplevel&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10552</id>
		<title>Proposition d&#039;article</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Proposition_d%27article&amp;diff=10552"/>
		<updated>2005-11-09T20:25:02Z</updated>

		<summary type="html">&lt;p&gt;Basiles : Développer en Ocaml&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Proposition d&#039;article =&lt;br /&gt;
Indiquer ici les articles qui manquent et que vous même désirez créer, puis créez les ! Si vous avez besoin de mettre des images dans votre article, n&#039;hésitez pas à demander à Léa les [[Lea_Linux:Groupe_Editeur|droit d&#039;éditeurs]]. &#039;&#039;&#039;Ne mettez pas&#039;&#039;&#039; des articles que vous désireriez voir écrits par quelqu&#039;un d&#039;autre que vous ! &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note :&#039;&#039;&#039; pour proposer un nouveau truc ou une nouvelle astuce, utiliser [[Trucs:Proposition_d&#039;un_truc|cette page]].&lt;br /&gt;
&lt;br /&gt;
* exemple : &amp;lt;nowiki&amp;gt;[[Nom de l&#039;article]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
== Rubrique : Installation ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : X Window ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Matériel ==&lt;br /&gt;
* [[Utilisation des jukebox creative sous linux]]  [[Utilisateur:Bimon]] 30 octobre 2005&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Logiciels ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Le réseau ==&lt;br /&gt;
[[Debian GNU/Linux et IPv6]]. [[Utilisateur: Thomas Carlu|Thomas Carlu]] 25 oct 2005 à 1:15 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Administrer ==&lt;br /&gt;
* [[Gestion des ACL]] (ou [[ACL]] pour le titre). [[Utilisateur:Vincent Ramos|Vincent Ramos]] 24 oct 2005 à 23:00 (CEST)&lt;br /&gt;
:Fait. Bien qu&#039;améliorable, l&#039;article me semble complet. [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 00:22 (CEST) ;&lt;br /&gt;
* [[Attributs étendus]] (&#039;&#039;chattr&#039;&#039; sur ext2 et ext3, outils efs2progs) [[Utilisateur:Vincent Ramos|Vincent Ramos]] 26 oct 2005 à 17:40 (CEST)&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Noyau et modules ==&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Développer ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Le language Ocaml ==&lt;br /&gt;
&lt;br /&gt;
Le language Ocaml est développé en France par une équipe de chercheurs de l&#039;[http://www.inria.fr INRIA], dont la plupart utilisent (et contribuent activement) à Linux.&lt;br /&gt;
&lt;br /&gt;
== Rubrique : Léavancé ==&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
	<entry>
		<id>https://lea-linux.org/docs/index.php?title=Utilisateur:Basiles&amp;diff=10551</id>
		<title>Utilisateur:Basiles</title>
		<link rel="alternate" type="text/html" href="https://lea-linux.org/docs/index.php?title=Utilisateur:Basiles&amp;diff=10551"/>
		<updated>2005-11-09T20:16:06Z</updated>

		<summary type="html">&lt;p&gt;Basiles : mini-page de Basile Starynkevitch&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Basile STARYNKEVITCH (Bourg La Reine - France) - voir sa page [http://starynkevitch.net/Basile ici]&lt;/div&gt;</summary>
		<author><name>Basiles</name></author>
	</entry>
</feed>