Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Modules recursifs #8284

Closed
vicuna opened this issue Sep 14, 2003 · 2 comments
Closed

Modules recursifs #8284

vicuna opened this issue Sep 14, 2003 · 2 comments

Comments

@vicuna
Copy link

vicuna commented Sep 14, 2003

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:

  1. le module B est choisi comme pivot pour le cycle A <-> B
  2. lorsque "let g = B.f" est évalué, B.f vaut fun () -> raise Undefined...
  3. 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

@vicuna
Copy link
Author

vicuna commented Sep 15, 2003

Comment author: administrator

This is another example that calls for a more precise static analysis of module
rec definitions. No obvious solution at the moment. -XL, 2003-09-15

@vicuna
Copy link
Author

vicuna commented Jun 17, 2006

Comment author: @xavierleroy

The example now works in 3.09 because of revised update strategy.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant