Université Paris 6
Licence d'in formatique
Module de Programmation
Année 1 999-2000


Travaux pratiques n° 0: Familiarisation avec CAML





1   Les modes de compilation d'un programme CAML

Il existe plusieurs façons de compiler un programme CAML. Tout d'abord, il est possible d'écrire un programme CAML dans un fichier et de le compiler pour obtenir un fichier exécutable. Ce fichier doit obligatoirement avoir l'extension .ml. La compilation du programme s'effectue en exécutant depuis un shell la commande :
  camlc fichier.ml -o fichier_executable

1.1   Le mode interactif

CAML est également fourni avec un mode interactif (dit boucle d'interaction), qui est activé depuis un shell par la commande camllight. Le prompt # vous invite à saisir les déclarations et expressions CAML. Les phrases CAML sont analysées, compilées et exécutées. À l'issue de l'exécution, le prompt réapparait, vous invitant à une nouvelle saisie.

L'éditeur du mode interactif est des plus rudimentaires : il ne vous permet de corriger que la ligne que vous êtes en train de taper en supprimant tous les caractères jusqu'au point de modification souhaitée. On utilise donc la plupart du temps un éditeur de texte pour taper ses programmes dès que leur taille dépasse la ligne.

1.2   L'éditeur de texte emacs et son mode CAML

emacs est un éditeur de texte aux possibilités très étendues. On dispose d'une interface permettant d'éditer des programmes CAML. L'éditeur se lance soit au moyen d'un des menus de votre interface graphique, soit par la commande emacs exécutée depuis un shell.

Pour faire fonctionner le mode Caml sous emacs, vous devez exécuter la première fois la commande Unix suivante :
  cp /Infos/caml-ens/99-00/tuareg-mode/2.emacs ~/.emacs
qui vous crée un fichier de configuration ~/.emacs pour emacs.

À partir de cet instant, si vous ouvrez un fichier dont le nom se termine par l'extension .ml, alors vous êtes automatiquement dans ce mode, le texte que vous tapez se colorie au fur et à mesure que des mots-clefs du langage sont reconnus, vous disposez d'un menu Tuareg qui vous propose d'évaluer la phrase courante, tout le contenu du buffer ou bien d'ouvrir un deuxième buffer où Caml est lancé interactivement.

2   Exercices


Exercice 1 (Fonctions réelles ou entières)
1. Écrire une fonction prenant un entier x et calculant la valeur de 2x2 + 3x - 2.
2. Écrire une fonction prenant un réel x et calculant la valeur de 2x2 + 3x - 2.
3. Écrire une fonction affichant les racines réelles (si elles existent) de l'équation ax2 + bx + c = 0 (a, b et c sont entiers).

Exercice 2 (Premières fonctions récursives)
1. Écrire une fonction calculant la factorielle d'un entier.
2. Écrire une fonction donnant le n-ième terme de la suite de Fibonacci. On rappelle que cette suite est définie par récurrence de la façon suivante :
ì
í
î
F0=F1=1
Fn+2=Fn+Fn+1 , pour tout n Î N


Exercice 3 (Les fonctions à plusieurs arguments)
1. Écrire la fonction entière power2 qui associe à un entier n sa puissance de 2, 2n.
2. Écrire la fonction entière power qui prend deux entiers x et y et leur associe xy.
3. Réécrire la fonction power pour qu'elle prenne des arguments de type float.

Exercice 4 (Les listes simples, filtrage et itérateurs)
1. Écrire une fonction retournant le deuxième élément d'une liste.
2. Écrire une fonction sommant les valeurs contenues dans une liste d'entiers.
3. Écrire une fonction affichant tous les éléments d'une liste d'entiers.
4. Écrire une fonction incrémentant d'une valeur entière, passée en paramètre, tous les éléments d'une liste d'entiers.
5. Écrire une fonction incrémentant d'une valeur entière, passée en paramètre, toutes les premières composantes d'une liste de couples d'entiers.
6. Écrire une fonction qui prend en argument une liste de couples et retourne la liste de leur première composante.
7. Écrire une fonction incrémentant d'une valeur entière, passée en paramètre, tous les premiers éléments d'une liste de listes d'entiers. Que se passe-t-il lorsque l'on passe une liste d'entiers en argument ? Et une liste de listes de listes d'entiers ?

Exercice 5 (Traits impératifs : la séquence, les boucles, l'affectation)
1. Écrire une fonction permutant le contenu de deux variables entières passées en paramètre.
2. Écrire une fonction affichant les nombres inférieurs à 1000 et dont la valeur est égale à la somme du cube du chiffre des centaines, du cube du chiffre des dizaines et du cube du chiffre des unités.

Exercice 6 (Représentation et manipulation de matrices)
1. Écrire une fonction calculant le produit de deux vecteurs de taille n.
2. Écrire une fonction calculant le produit de deux matrices de taille n * n.

Exercice 7 (Manipulation de tableaux)
1. Écrire une fonction permutant deux éléments d'un tableau T, d'indices respectifs i et j.
2. Écrire une fonction de tri des éléments d'un tableau basé sur l'algorithme de tri par sélection-échange. Le tri par sélection-échange procède en deux étapes pour placer chaque élément à sa place définitive :
3. Peut-on utiliser la fonction de tri que vous avez définie précédemment pour trier un tableau de listes selon la longueur des listes ? Si ce n'est pas le cas, modifiez vos fonctions réalisant le tri afin de pouvoir trier les éléments du tableau selon n'importe quel critère (admettant un ordre) associé à chaque élément du tableau (par exemple la longueur de la liste, sa profondeur, le nombre d'occurrences du caractère 'i', le nombre de 0 dans la représentation binaire associée ...)

Exercice 8 (Les fonctions polymorphes)
1. Définir la fonction identité, qui à une valeur associe elle-même.
2. Écrire une fonction applique prenant deux arguments, et appliquant le premier sur le second. Commentez le type de cette fonction, et trouvez un contre-exemple mal typé de son utilisation.
3. La fonction prédéfinie print_int : int -> int prend un argument entier, l'affiche à l'écran et retourne la valeur (). Définissez la fonction id_print qui prend un entier et le rend, en l'ayant préalablement affiché à l'écran.


Ce document a été traduit de LATEX par HEVEA.