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

Compilation des modules recursifs #2475

Closed
vicuna opened this issue Apr 18, 2004 · 1 comment
Closed

Compilation des modules recursifs #2475

vicuna opened this issue Apr 18, 2004 · 1 comment
Labels

Comments

@vicuna
Copy link

vicuna commented Apr 18, 2004

Original bug ID: 2475
Reporter: administrator
Status: closed
Resolution: fixed
Priority: normal
Severity: minor
Category: ~DO NOT USE (was: OCaml general)

Bug description

Full_Name: Yoann Fabre
Version: 3.07+2
OS: WinXP + Cygwin
Submission from: amontsouris-108-1-15-199.w80-14.abo.wanadoo.fr (80.14.150.199)

Salut,

Le probleme est le suivant :
1)

  • j'ai un foncteur destine a etre utilise par un "module rec" : Make
  • ce foncteur Make est "pur" au toplevel (i.e. que des fonctions)
  • ce foncteur contiends un sous-module ayant grosso modo
    l'interface Set.S. Ce sous-module Set n'est donc pas "pure"
    (a cause de "val empty : t"). Seules des fonctions de Set appelle
    Make.
  • j'applique Make avec "module rec" sur un module M (cf. ci-dessous)
  • j'applique une function de Make qui est recursive avec une function de M
  • ca compile...
  • et j'ai ...
    Undefined_recursive_module
  1. Pourquoi est-ce que je pense que c'est un bug ?
  • "j'ouvre" la recursion dans Make (je remplace l'appel sur son
    module argument par un appel sur une reference locale sur fonction)
  • je "defini" la reference apres le "module rec"
  • ca /marche/
    DONC : la recursion est bien fonde
  1. Plus marrant encore...
  • Dans le sous-module Set de Make je supprime la valeur "empty"
    (la seule qui ne soit pas une fonction dans Make)
  • Je refais (2) (i.e. vrai recursion entre modules)
  • ca /marche/
    DONC : le fait que Set possede une code d'initialisation empeche le
    compilateur
    de generer un code d'initialisation correcte pour Make !!!
    Noter que M est "safe" de toute facon, donc d'apres la doc le compilateur
    doit accepter la definition. Make est lui-meme presque "safe" (a l'exception
    de "empty" qui est equivalente a "let empty = 0".

4') Noter une erreur dans le doc (language ext. module rec.)
la declaration presentee en exemple n'utilise /pas/ module rec !!!!

  1. Tout cela n'est pas tres claire... je sais...
    je tiens a votre disposition un jeu de 5 exemples qui demontre le pb.
    Comme il semble que l'on ne puisse pas mettre d'attachement a ce report...
    ben... que celui qui est interesse par ce pb me demande les ex. par mail...

  2. Mis a part ca... "module rec" est /bien/... et encore felication pour Ocaml

@++ Yoann (code ci-dessous)

  1. Pendant que j'y suis (desole ce na rien avoir... mais je n'ai pas le
    temps d'approfondir... sur mon system :
    $ ocaml
    Objective Caml version 3.07+2

open StdLabels;;

open MoreLabels;;

module M = Map.Make(String);;

Segmentation fault (core dumped)


module rec Ctor : sig
type t = U | C of string | A of Type.t * Type.t
exception Fail
val merge: t -> t -> t
end =
struct
type t = U | C of string | A of Type.t * Type.t
exception Fail
let merge t t' =
match t, t' with
| U, _ -> t'
| _, U -> t
| C s1, C s2 when s1 = s2 -> t
| A(t1, t2), A(t1', t2') -> Type.unify t1 t1'; Type.unify t2 t2'; t
| _ -> raise Fail
end
and Type : S with type value = Ctor.t = Make(Ctor)

module type MERGEABLE =
sig
type t
val merge: t -> t -> t
end
module type S =
sig
type value
type t
val create: value -> t
val uid: t -> int
val value: t -> value
val unify: t -> t -> unit (******** HERE : call merge *)
module Set :
sig
type elt = t
type t
val empty: t
val is_empty: t -> bool
val singleton: elt -> t
.......
end
end
module Make(M : MERGEABLE) : S with type value = M.t

@vicuna
Copy link
Author

vicuna commented Jun 22, 2004

Comment author: administrator

The "module rec" behavior is as expected. Cannot reproduce segfault. Updated
StdLabels to follow evolutions of String 2004-06-22 XL.

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

No branches or pull requests

1 participant