You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Original bug ID: 1701 Reporter: administrator Status: closed Resolution: not a bug Priority: normal Severity: minor Category: ~DO NOT USE (was: OCaml general)
Bug description
Bonjour,
je ne comprends pas pourquoi ce code n'est pas correctement exécuté :
il s'agit de l'implémentation d'une boucle for de façon récursive :
let rec my_for=function borne_i -> function borne_s ->function
expression ->
expression;
if (borne_i<borne_s) then (
print_int(i);
my_for borne_i (borne_s-1) expression );;
et quand je l'éxecute avec my_for 0 9 (print_string("djame"));;
j'obtiens :
djame987654321- : unit =
Manifestement, vu qu'on affiche les indices, on effectue bien 9 appels
récursifs donc on devrait voir s'executer 9 fois le bloc "expression"
or ca n'a lieu qu'une seule fois.
J'ai beau chercher je ne vois pas pourquoi ca a ce comportement.
Si vous pouviez me donner une indication, ca serait vraiment trés gentil.
Bonjour,
je ne comprends pas pourquoi ce code n'est pas correctement exécuté :
il s'agit de l'implémentation d'une boucle for de façon récursive :
let rec my_for=function borne_i -> function borne_s ->function
expression ->
expression;
if (borne_i<borne_s) then (
print_int(i);
my_for borne_i (borne_s-1) expression );;
et quand je l'éxecute avec my_for 0 9 (print_string("djame"));;
j'obtiens :
djame987654321- : unit =
Manifestement, vu qu'on affiche les indices, on effectue bien 9 appels
récursifs donc on devrait voir s'executer 9 fois le bloc "expression"
or ca n'a lieu qu'une seule fois.
J'ai beau chercher je ne vois pas pourquoi ca a ce comportement.
Si vous pouviez me donner une indication, ca serait vraiment trés gentil.
L'expression que vous passez en argument est évaluée avant l'appel
à la fonction (cela s'appelle le passage des arguments par valeur).
Ce qu'il se passe lorsque vous faites my_for 0 9 (print_string("djame")) :
Les expressions 0, 9 et (print_string("djame")) sont évaluées, ce qui
donne l'affichage de "djame". L'expression (print_string("djame")) a
le type unit.
Dans le corps de votre fonction, l'expression
expression;
ne fait rien, car il s'agit de la valeur ().
Ce que vous souhaitez faire est passer une fonction en argument
de votre fonction my_for, et appliquer cette fonction à chaque tour
de "boucle":
let rec my_for=function borne_i -> function borne_s ->function f ->
f () ;
if (borne_i<borne_s) then (
print_int(i);
my_for borne_i (borne_s-1) f );;
Pour avoir le résultat que vous attendiez, vous faites alors :
my_for 0 9 (fun () -> print_string("djame"))
Le fait que l'expression (fun () -> print_string("djame")) prenne un paramètre
empêche l'évaluation de print_string("djame") (on dit "qu'on évalue pas
sous les lambdas"). L'expression f () déclenche cette évaluation à chaque
tour de "boucle".
Original bug ID: 1701
Reporter: administrator
Status: closed
Resolution: not a bug
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)
Bug description
Bonjour,
je ne comprends pas pourquoi ce code n'est pas correctement exécuté :
il s'agit de l'implémentation d'une boucle for de façon récursive :
let rec my_for=function borne_i -> function borne_s ->function
expression ->
expression;
if (borne_i<borne_s) then (
print_int(i);
my_for borne_i (borne_s-1) expression );;
et quand je l'éxecute avec my_for 0 9 (print_string("djame"));;
j'obtiens :
djame987654321- : unit =
Manifestement, vu qu'on affiche les indices, on effectue bien 9 appels
récursifs donc on devrait voir s'executer 9 fois le bloc "expression"
or ca n'a lieu qu'une seule fois.
J'ai beau chercher je ne vois pas pourquoi ca a ce comportement.
Si vous pouviez me donner une indication, ca serait vraiment trés gentil.
Cordialement,
Djamé
--
Djamé Seddah
LORIA / Campus Scientifique
BP239
F-54506 VANDOEUVRE-LES-NANCY CEDEX
FRANCE
tel : 00 33 3 83 59 20 47 / fax : 00 33 3 83 41 30 79
The text was updated successfully, but these errors were encountered: