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: 1834 Reporter: administrator Status: closed (set by @xavierleroy on 2006-06-17T09:39:53Z) Resolution: fixed Priority: normal Severity: feature Category: ~DO NOT USE (was: OCaml general)
Bug description
Soit le programme suivant:
module rec A : sig val f : unit -> unit end =
struct
let g = B.f
let f () = g ()
end
and B : sig val f : unit -> unit end = struct
let f () = ()
end
let () = A.f ()
Il provoque une erreur Undefined_recursive_module au runtime. Si je
comprends bien comment ça marche, c'est parce que:
le module B est choisi comme pivot pour le cycle A <-> B
lorsque "let g = B.f" est évalué, B.f vaut fun () -> raise Undefined...
donc la valeur de g dans A.f sera toujours cette abstraction bidon
même à la fin de l'evaluation des deux structures
Si on remplace g par B.f dans A.f, ça marche. C'est assez troublant, parce
qu'il n'y a pas à proprement parler de recursion mal fondée. Il faudrait
peut-être donner ce genre d'exemples dans le manuel.
Quelques remarques:
dans cet exemple, si A avait été choisi comme module pivot,
ça aurait marché, je pense. Est-ce qu'il y a un moyen de prévoir quel
module sera choisi?
il y a une notion de dépendance faible dans une
definition récursive, lorsqu'un module ne dépend d'aucune valeur des
autres, éventuellement de leurs types. Dans ce cas, c'est toujours une
bonne chose de choisir B comme pivot, mais on peut le compiler sans mettre
les valeurs bidons. Ca peut etre detecté approximativement de manière
simple (et de manière exacte s'il n'y a pas d'application de foncteur
pour ce module là, je pense).
-- Alain
The text was updated successfully, but these errors were encountered:
Original bug ID: 1834
Reporter: administrator
Status: closed (set by @xavierleroy on 2006-06-17T09:39:53Z)
Resolution: fixed
Priority: normal
Severity: feature
Category: ~DO NOT USE (was: OCaml general)
Bug description
Soit le programme suivant:
module rec A : sig val f : unit -> unit end =
struct
let g = B.f
let f () = g ()
end
and B : sig val f : unit -> unit end = struct
let f () = ()
end
let () = A.f ()
Il provoque une erreur Undefined_recursive_module au runtime. Si je
comprends bien comment ça marche, c'est parce que:
même à la fin de l'evaluation des deux structures
Si on remplace g par B.f dans A.f, ça marche. C'est assez troublant, parce
qu'il n'y a pas à proprement parler de recursion mal fondée. Il faudrait
peut-être donner ce genre d'exemples dans le manuel.
Quelques remarques:
dans cet exemple, si A avait été choisi comme module pivot,
ça aurait marché, je pense. Est-ce qu'il y a un moyen de prévoir quel
module sera choisi?
il y a une notion de dépendance faible dans une
definition récursive, lorsqu'un module ne dépend d'aucune valeur des
autres, éventuellement de leurs types. Dans ce cas, c'est toujours une
bonne chose de choisir B comme pivot, mais on peut le compiler sans mettre
les valeurs bidons. Ca peut etre detecté approximativement de manière
simple (et de manière exacte s'il n'y a pas d'application de foncteur
pour ce module là, je pense).
-- Alain
The text was updated successfully, but these errors were encountered: