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: 2475 Reporter: administrator Status: closed Resolution: fixed Priority: normal Severity: minor Category: ~DO NOT USE (was: OCaml general)
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
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
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 !!!!
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...
Mis a part ca... "module rec" est /bien/... et encore felication pour Ocaml
@++ Yoann (code ci-dessous)
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
The text was updated successfully, but these errors were encountered:
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)
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.
Undefined_recursive_module
module argument par un appel sur une reference locale sur fonction)
DONC : la recursion est bien fonde
(la seule qui ne soit pas une fonction dans Make)
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 !!!!
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...
Mis a part ca... "module rec" est /bien/... et encore felication pour Ocaml
@++ Yoann (code ci-dessous)
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
The text was updated successfully, but these errors were encountered: