“doc” (Col. : Science Sup 17x24) — 2007/7/19 — 18:18 — page 266 — #276
i
i
i
i
i
i
i
i
266
5
• La programmation avec état explicite
– Codez l’exemple dans le modèle de calcul avec état. Utilisez le codage suivant
pour array[1..10] :
A={MakeTuple array 10}
for J in 1..10 do A.J={NewCell 0} end
Codez le tableau comme un tuple de cellules.
– Expliquez de nouveau le comportement en utilisant votre codage.
➤ Exercice 8 — Le passage par besoin
Avec le passage par nom, l’argument est évalué chaque fois que l’on en a besoin.
Avec le passage par besoin, il est évalué au maximum une fois.
– Pour cet exercice, reprenez l’exemple de la permutation de l’exercice précédent avec le passage par besoin au lieu du passage par nom. Le comportement
curieux arrive-t-il toujours ? Si non, des problèmes similaires peuvent-ils arriver avec le passage par besoin en changeant la définition de swap ?
– Dans l’exemple du passage par besoin de la section 5.4.3, le corps de Sqr
appellera toujours la fonction A. C’est raisonnable pour Sqr, puisque par
inspection nous voyons que le résultat est utilisé trois fois. Mais que fera-t-on
si on ne peut pas déterminer le besoin par inspection ? Nous ne voulons pas
appeler A sans besoin. Une possibilité est d’utiliser une fonction paresseuse.
Pour cet exercice, faites les choses suivantes :
• Apprenez à écrire des fonctions paresseuses en étudiant la documentation
appropriée [35, 97].
• Modifiez le code de la section 5.4.3 avec l’exécution paresseuse pour appeler A uniquement si on en a besoin, même si on ne peut pas déterminer ce
besoin par inspection. A doit être appelée au maximum une fois.
➤ Exercice 9 — L’instruction break
Un bloc est une séquence d’instructions avec un point d’entrée et un point de
sortie. Beaucoup de langages impératifs modernes, comme le Java et le C++,
sont basés sur le concept de bloc. Ces langages permettent la définition de blocs
imbriqués et offrent une opération pour sortir immédiatement jusqu’au point
de sortie du bloc le plus imbriqué. Cette opération s’appelle break. Pour cet
exercice, définissez une construction de bloc avec une opération break, qui peut
être appelée ainsi :
{Block proc {$ Break} stmt end}
Cela doit avoir exactement le même comportement que l’exécution de stmt,
sauf que l’exécution de {Break} à l’intérieur de stmt doit immédiatement
sortir du bloc. Votre solution doit fonctionner correctement pour les blocs imbriqués et pour les exceptions levées dans les blocs. Si stmt crée des fils, alors
ceux-ci ne devront pas être affectés par l’opération break.
i
i
i
i
i
i
i
i
266
5
• La programmation avec état explicite
– Codez l’exemple dans le modèle de calcul avec état. Utilisez le codage suivant
pour array[1..10] :
A={MakeTuple array 10}
for J in 1..10 do A.J={NewCell 0} end
Codez le tableau comme un tuple de cellules.
– Expliquez de nouveau le comportement en utilisant votre codage.
➤ Exercice 8 — Le passage par besoin
Avec le passage par nom, l’argument est évalué chaque fois que l’on en a besoin.
Avec le passage par besoin, il est évalué au maximum une fois.
– Pour cet exercice, reprenez l’exemple de la permutation de l’exercice précédent avec le passage par besoin au lieu du passage par nom. Le comportement
curieux arrive-t-il toujours ? Si non, des problèmes similaires peuvent-ils arriver avec le passage par besoin en changeant la définition de swap ?
– Dans l’exemple du passage par besoin de la section 5.4.3, le corps de Sqr
appellera toujours la fonction A. C’est raisonnable pour Sqr, puisque par
inspection nous voyons que le résultat est utilisé trois fois. Mais que fera-t-on
si on ne peut pas déterminer le besoin par inspection ? Nous ne voulons pas
appeler A sans besoin. Une possibilité est d’utiliser une fonction paresseuse.
Pour cet exercice, faites les choses suivantes :
• Apprenez à écrire des fonctions paresseuses en étudiant la documentation
appropriée [35, 97].
• Modifiez le code de la section 5.4.3 avec l’exécution paresseuse pour appeler A uniquement si on en a besoin, même si on ne peut pas déterminer ce
besoin par inspection. A doit être appelée au maximum une fois.
➤ Exercice 9 — L’instruction break
Un bloc est une séquence d’instructions avec un point d’entrée et un point de
sortie. Beaucoup de langages impératifs modernes, comme le Java et le C++,
sont basés sur le concept de bloc. Ces langages permettent la définition de blocs
imbriqués et offrent une opération pour sortir immédiatement jusqu’au point
de sortie du bloc le plus imbriqué. Cette opération s’appelle break. Pour cet
exercice, définissez une construction de bloc avec une opération break, qui peut
être appelée ainsi :
{Block proc {$ Break} stmt end}
Cela doit avoir exactement le même comportement que l’exécution de stmt,
sauf que l’exécution de {Break} à l’intérieur de stmt doit immédiatement
sortir du bloc. Votre solution doit fonctionner correctement pour les blocs imbriqués et pour les exceptions levées dans les blocs. Si stmt crée des fils, alors
ceux-ci ne devront pas être affectés par l’opération break.
