Une solution du TD 1 de Caml (v.16.1)

Exercice 1.
Relire le cours :-).

Exercice 2
1.
2+3*4;;
2.5+.3.5*.4.5;;
2.5+.float_of_int(3*4);;
2.5+.float_of_int(3)*.4.5;;
2.5−.float_of_int(3)*.4.5;;

2.
a−3 soustrait 3 de la variable entière a.
a_3 est le nom d'une variable.
ab−3 soustrait 3 de la variable ab
ab_3 est le nom d'une variable.

Exercice 3
5/2;; donne - : int = 2 qui correspond à la valeur entière 2
2000/10;; → 200
2013 mod 2;; → 1
5 mod 2;; → 1
2000 mod 10;; → 0
2013 mod 4;; → 1
1789/10;; → 178 (;: au lieu de ;; est une erreur typographique (quel serait son effet ?))
2011 mod 2;; → 1
4 mod 2013;; → 4
1789 mod 10;; → 9
2012 mod 2;; → 0

Exercice 4
1.
(1<2) donne - : bool = true qui correspond à la valeur booléenne true (vrai)
not (4=3) → false
(1<2)&∓&(4=3) → false
'A'<'Z' → true (ordre du codage ASCII)
(1<2)||(4=3) → true
"Bonjour" donne - : string = "Bonjour" qui correspond à la chaine de caractères "Bonjour"
"Bonjour".[0] donne - : char = "B" qui correspond au premier caractère de la chaine
'A'>'9' → false
"Bonjour".[3] → 'n'
"Voici"^"une chaine"→ "Voiciune chaine"
("Voila"^"Voila").[6] → 'o'
'A'<'a' → true

2.
"Bonjour".[7] donne Exception: Invalid_argument "index out of bounds".
"Voila"^"Voila".[6] donne Error: This expression has type char bue an expression was expected of type string (priorité de l'opérateur . sur l'opérateur ^)
(1<5<10) donne This expression has type int but an expression was expected of type bool (les opérateurs logiques sont binaires)

3.
"Ceci est "^(" une chaine".[10]) → l'opérateur ^ ne peut être utiliser que pour les chaines
("Ceci est "^" une chaine").[10] → 'n'
"(Ceci est "^" une chaine").[10] → erreur de syntaxe (parenthésage)

Exercice 5
1. 0 est un entier et '0' est un caractère
2. '0'
3. int_of_char('7')−int_of_char('0')=7 (différence de code ASCII)
4. → 25 (distance dans l'ordre alphabétique)
5. false
6. aucun, le code ASCII d'un caractère est sémantiquement arbitraire
Exercice 6
'A'
'n'
'"'
'\'' (càd \' entre apostrophes)
'/'
'\\'
' '
'\n' ou '\010' (càd :char_of_int(10))
'\r' ou '\013'
'\t' ou '\009'
On utilise en général le caractère '_' (souligné)

Exercice 7
1. 'h' est un caractère et "h" une chaine de caractère (types différents) ; 'hello world' n'existe pas.
2. "helloworld" (ne pas ajouter d'espace qui n'existent pas).
3. false (construire l'arbre syntaxique d'interprétation de l'expression).
4.() est une valeur (la seule) de type unit, max_int une valeur de type int, par contre "a" est une valeur de type chaine et 'a' est une valeur de types caractère.

Exercice 8
2*3.14;; → erreur, l'opérateur * nécessite deux entiers.
3.14/.2;; → erreur, l'opérateur *. nécessite deux réels.
"A"^'B';;→ erreur, l'opérateur ^ nécessite deux chaines.
'A'^'B';;→ erreur, l'opérateur ^ nécessite deux chaines.
char of int (int of char 'A' − 255);; → pas de caractère de code -190.

Exercice 9
x : variable (et donc identificateur).
X : identificateur mais pas variable.
a+b : opération sur des entier, pas identificateur.
x2 : variable.
x_2 : variable.
X_2 : identificateur.
2_3 : interdit!
Ab : identificateur.
aB : variable.

Exercice 10
let x=1;; let y=2;; let z=x+y;; → x=1, y=2, z=3.
let x=1;; let y=2;; let y=10 in x+y;; → x=1, y=2, z non défini si pas affecté auparavant.
let x=1;; let y=2;; let y=10 in let z=x+y;; → x=1, y=2, z=11.
let z=(let x=1 and y=2 in x+y);; → x et y non définis si pas affectés auparavant, z=3.
let z=(let x=1 and y=2 and z=3 in x+y+z);; → x et y non définis si pas affectés auparavant, z=6.

Exercice 11
let x = 12;; → val x : int = 12
let y = 0 and x = 2;; → val y : int = 0   val x : int = 2
let x = 1 in x+x;; → - : int = 2
let x = 3 and y = 2 in x*y;; → - : int = 6
let x = 2 in let x = 3 in x;; → - : int = 3 (Warning 26: unused variable x).
let x = 4 in let x = 5+x in 6+x;; → - : int = 15
let a = 2 in let a = 3 and b = a in a+b;; → - : int = 5

Exercice 12
if (x>=0) then x else (minus;x);;
if (x>=0) then float_of_int(x)/.3. else 0;;
if ((x mod 2)==0) then x/2 else 3*x+1;;
if ((x.[0]>='A')&&(x.[0]<='Z')) then x.[0] else x.[1];;
N.B. Cette expression donne une erreur si la chaine n'est pas assez longue., on pourrait utiliser un test sur la longueur String.length(x) de la chaine et retourner un caractère quelconque si on est hors des cas attendus. On pourrait aussi utiliser failwith.
Exercice 13
if 'A'<'a' then "A d'abord" else "a d'abord";; → "A d'abord" (ordre ASCII).
if 'bas'<"basset" then "bas d'abord" else "basset d'abord";; → "bas d'abord" (ordre lexicographique).
if 'A'<'7' then "A d'abord";; → erreur car else est obligatoire.
if 'A'<'a' then "A" else 'a';; → erreur "A" et 'a' de type différents.
if 'A'<7 then "A d'abord" else "7 d'abord";; → comparaison interdite car 'A' et 7 sont de type différents.
if 'A'<"a" then 'A d'abord' else "a d'abord";; → comparaison interdite car 'A' et "a" sont de type différents.