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

addendum sur la definition multiple dans les modules #3246

Closed
vicuna opened this issue Mar 8, 2002 · 2 comments
Closed

addendum sur la definition multiple dans les modules #3246

vicuna opened this issue Mar 8, 2002 · 2 comments
Labels

Comments

@vicuna
Copy link

vicuna commented Mar 8, 2002

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

Bug description

salut,

je voudrais ajouter un element au probleme des definitions multiples
dans les modules (cf. "bug 811"): en effet, cela n'est pas permis pour
les sous-modules et les sous-signatures, e.g.

module M =

struct
module N = struct let x=3 end
module N = struct let x=3 end
end;;

Multiple definition of the module name N.
Names must be unique in a given structure or signature.

Ce message est donc inexact puisque la definition
suivante est acceptee:

module P =

struct
let x = 3
let x = 3.1
end;;

Un des interets des definitions multiples de modules est en
particulier de pouvoir faire des redefinitions lors d'inclusions.
Par exemple, lors d'une extension d'un module comme Hashtbl, ce serait
bien de pouvoir redefinir le foncteur interne Make apres une inclusion
globale de Hashtbl (cf. exemple ci-dessous).

La reponse officielle actuelle dans la bug-list au bug 811 est de dire
qu'il faut simplifier les signatures incluant des definitions
multiples, et donc ne considerer implicitement que la derniere
occurence de chaque definition multiple. Mais il serait peut-etre
preferable de:

a) Ajouter un mot-clef dans la syntaxe qui permetterait d'indiquer que
la definition multiple est deliberee et non pas erronee.

et bien sur:

b) Avoir un comportement similaire pour tout element defini de maniere
multiple (entiers, fonctions, modules, etc...)

pn

Un exemple possible d'utilisation de la redefinition apres inclusion:

module Extended_Hashtbl =
struct
include Hashtbl

let nb_elements_aux iterator h = 
  let count = ref 0 in 
  iterator (fun x y -> incr count) h;
  !count

let nb_elements h  = nb_elements_aux Hashtbl.iter h

module type Extended_S = 
  sig
    include Hashtbl.S
    val nb_elements : 'a t -> int
  end      

module E_Make(H: HashedType) 
    : Extended_S with type key = H.t = 
  struct
    module Tmp = Hashtbl.Make (H)
    include Tmp
        
    let nb_elements h = nb_elements_aux Tmp.iter h
  end

end;;

@vicuna
Copy link
Author

vicuna commented Mar 11, 2002

Comment author: administrator

Salut Philippe,

je voudrais ajouter un element au probleme des definitions multiples
dans les modules (cf. "bug 811"): en effet, cela n'est pas permis pour
les sous-modules et les sous-signatures, e.g.

module M =

struct
module N = struct let x=3 end
module N = struct let x=3 end
end;;

Multiple definition of the module name N.
Names must be unique in a given structure or signature.

Ce message est donc inexact puisque la definition
suivante est acceptee:

module P =

struct
let x = 3
let x = 3.1
end;;

Le message devrait être plus précis en effet: les noms de types, de
modules, et de types de modules doivent être uniques dans une
structure ou signature. Pour les noms de types, la raison est la suivante:

module M =
struct
type t = int
let x = (1 : t)
type t = bool
let y = (true : t)
end

Si on acceptait cela, avec la convention qu'on garde seulement la
dernière définition du type t, on aurait la signature suivante pour M:

M : sig type t = bool val x : t val y : t end

et on croirait que M.x et M.y ont le même type M.t, ce qui casse le
système de types.

Le raisonnement est le même pour les types de modules.

Pour les modules, eh bien un sous-module peut contenir des composantes
de types ou de types de modules, donc deux sous-modules de même nom
peuvent aussi casser le système de types.

Cela nous laisse uniquement les valeurs (et assimilés, e.g. les
exceptions) comme composantes de structures que l'on peut sans danger
redéfinir, avec la sémantique habituelle de ML (la dernière définition
est celle qui est exportée).

Un des interets des definitions multiples de modules est en
particulier de pouvoir faire des redefinitions lors d'inclusions.
Par exemple, lors d'une extension d'un module comme Hashtbl, ce serait
bien de pouvoir redefinir le foncteur interne Make apres une inclusion
globale de Hashtbl (cf. exemple ci-dessous).

Je suis à peu près sûr que l'on peut casser le système de types comme
cela.

La reponse officielle actuelle dans la bug-list au bug 811 est de dire
qu'il faut simplifier les signatures incluant des definitions
multiples, et donc ne considerer implicitement que la derniere
occurence de chaque definition multiple.

Pour les composantes de valeur, oui.

Mais il serait peut-etre
preferable de:

a) Ajouter un mot-clef dans la syntaxe qui permetterait d'indiquer que
la definition multiple est deliberee et non pas erronee.

Il faudrait quand même vérifier que les deux définitions sont
identiques du point de vue des types (e.g. mêmes composantes de types
pour deux sous-modules), ce qui restreint fortement l'utilité!

et bien sur:

b) Avoir un comportement similaire pour tout element defini de maniere
multiple (entiers, fonctions, modules, etc...)

J'espère t'avoir convaincu qu'il y a une différence forte entre
redéfinition de valeurs (entiers, fonctions, modules) d'une part,
et de types ou de modules de l'autre.

Amicalement,

  • Xavier

@vicuna
Copy link
Author

vicuna commented Mar 13, 2002

Comment author: administrator

voir #3152

@vicuna vicuna closed this as completed Jun 18, 2002
@vicuna vicuna added the bug label Mar 19, 2019
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