Version française
Home     About     Download     Resources     Contact us    
Browse thread
Renaming structures during inclusions?
[ Home ] [ Index: by date | by threads ]
[ Search: ]

[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
Date: -- (:)
From: Jacques Garrigue <garrigue@m...>
Subject: Re: [Caml-list] Renaming structures during inclusions?
Well, somebody already worked out a real solution to this problem, at
least at the signature level:
   http://www.eecs.harvard.edu/~nr/pubs/els-abstract.html

The point is that once you have solved the signature level problem,
you can solve the module level problem: you just have to duplicate your
binding under a new name, and hide the old one with a signature
where the type is renamed. You could have syntactic sugar for that,
but the semantics is clear.

So my take on this problem is that the above proposal, or something
equivalent, should be included in the language.

Jacques Garrigue

From: Markus Mottl <markus.mottl@gmail.com>

> I have run into a problem using the "include"-keyword for including
> module definitions in other modules. E.g.:
> 
> ----------------------------------------------
> module M1 = struct
>   type t
>   module Std = struct end
> end
> 
> module M2 = struct
>   type t
>   module Std = struct end
> end
> 
> module M = struct
>   include M1
>   include M2
> end
> ----------------------------------------------
> 
> The above is not possible, because the names for type t in M1 and M2,
> and the module names for module Std clash. Though it would not lead to
> any kind of unsoundness to allow this, it would make referring to
> shadowed types or modules impossible, both for the user and also for
> the compiler in error messages.
> 
> The only solution that seems to make sense and does not impose
> excessive work on the user is, IMHO, to provide for a facility to
> rename types and modules, e.g. maybe something like:
> 
> ----------------------------------------------
> module M = struct
>   include M1
>     with type t as m1_t
>     with module Std as M1Std
> 
>   include M2
>     with type t as m2_t
>     with module Std as M2Std
> 
>   module Std = struct
>     include M1Std
>     include M2Std
>   end
> end
> ----------------------------------------------
> 
> In the above example I also added a new Std-module that includes the
> contents of the two old ones.
> 
> The only current way to get something similar right now is to
> explicitly create new bindings for all entities in the modules to be
> included, which may be an enormous amount of work depending on their
> size.
> 
> What do the developers think? Would it be a good idea to add a
> renaming facility to the language (it wouldn't even require any new
> keywords)?
> 
> Best regards,
> Markus
> 
> -- 
> Markus Mottl        http://www.ocaml.info        markus.mottl@gmail.com