[Caml-list] Private modules in packages

2010-05-21 Thread Hans Ole Rafaelsen
Hi,

When packing a set of modules into a top module using -pack, is there a way
to have some of the modules private to the package?

If I have the modules Helper, Foo and Bar. Helper provides helper functions
used by Foo and Bar. When I'm packing them into a top mudule P, I do not
want to expose the functions of Helper to users of P.

Is there some way to achieve this?  If not, do anyone know of other ways for
packing libraries and keeping some of the modules private to the library?


Thanks,

Hans Ole Rafaelsen
___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Michaël Grünewald

Hi Hans,
Hans Ole Rafaelsen wrote:

When packing a set of modules into a top module using -pack, is there 
a way to have some of the modules private to the package?


If I have the modules Helper, Foo and Bar. Helper provides helper 
functions used by Foo and Bar. When I'm packing them into a top mudule 
P, I do not want to expose the functions of Helper to users of P.


Is there some way to achieve this?  If not, do anyone know of other 
ways for packing libraries and keeping some of the modules private to 
the library?


IIRC you have to write an interface file (MLI) for the package.
--
Regards,
Michael

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Julien Signoles
Hello,

2010/5/21 Hans Ole Rafaelsen hrafael...@gmail.com

 When packing a set of modules into a top module using -pack, is there a way
 to have some of the modules private to the package?

 If I have the modules Helper, Foo and Bar. Helper provides helper functions
 used by Foo and Bar. When I'm packing them into a top mudule P, I do not
 want to expose the functions of Helper to users of P.

 Is there some way to achieve this?  If not, do anyone know of other ways
 for packing libraries and keeping some of the modules private to the
 library?


Just write yourself a file p.mli without your private modules:
=== p.mli ===
module Foo : ...
module Bar : ...
==
Of course, you can not refer to signatures of modules Foo and Bar in p.mli.
Thus you have to duplicate them or, better, to write them somewhere outside
the package.

From a compilation point of view, be sure to generate p.cmi by using p.mli
before generating the pack files p.cm[ox].

We use such a trick in the Frama-C tool (http://frama-c.com) for providing
(usually empty) interfaces of its plug-ins. But I do not recommend you to
read the Frama-C Makefiles for looking at the corresponding compilation
lines (except if you are **very** motivated).

Hope this helps,
Julien
___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Hans Ole Rafaelsen
Thanks Michael and Julien,

That did the trick. I manually inserted the content of the Bar.mli and
Foo.mli into the P.mli file. Guess unless it is some way to include this
automatically the best will be to write a script to generate the P.mli file
automatically based on current version of Bar.mli and Foo.mli as part of the
build process.

-- 
Hans Ole

On Fri, May 21, 2010 at 10:53 AM, Julien Signoles julien.signo...@gmail.com
 wrote:

 Hello,

 2010/5/21 Hans Ole Rafaelsen hrafael...@gmail.com

 When packing a set of modules into a top module using -pack, is there a way
 to have some of the modules private to the package?

 If I have the modules Helper, Foo and Bar. Helper provides helper
 functions used by Foo and Bar. When I'm packing them into a top mudule P, I
 do not want to expose the functions of Helper to users of P.

 Is there some way to achieve this?  If not, do anyone know of other ways
 for packing libraries and keeping some of the modules private to the
 library?


 Just write yourself a file p.mli without your private modules:
 === p.mli ===
 module Foo : ...
 module Bar : ...
 ==
 Of course, you can not refer to signatures of modules Foo and Bar in p.mli.
 Thus you have to duplicate them or, better, to write them somewhere outside
 the package.

 From a compilation point of view, be sure to generate p.cmi by using p.mli
 before generating the pack files p.cm[ox].

 We use such a trick in the Frama-C tool (http://frama-c.com) for providing
 (usually empty) interfaces of its plug-ins. But I do not recommend you to
 read the Frama-C Makefiles for looking at the corresponding compilation
 lines (except if you are **very** motivated).

 Hope this helps,
 Julien

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Ashish Agarwal
 write a script to generate the P.mli file

Why do you need Bar.mli and Foo.mli at all? Just write the P.mli only.


On Fri, May 21, 2010 at 5:51 AM, Hans Ole Rafaelsen hrafael...@gmail.comwrote:

 Thanks Michael and Julien,

 That did the trick. I manually inserted the content of the Bar.mli and
 Foo.mli into the P.mli file. Guess unless it is some way to include this
 automatically the best will be to write a script to generate the P.mli file
 automatically based on current version of Bar.mli and Foo.mli as part of the
 build process.

 --
 Hans Ole


 On Fri, May 21, 2010 at 10:53 AM, Julien Signoles 
 julien.signo...@gmail.com wrote:

 Hello,

 2010/5/21 Hans Ole Rafaelsen hrafael...@gmail.com

 When packing a set of modules into a top module using -pack, is there a
 way to have some of the modules private to the package?

 If I have the modules Helper, Foo and Bar. Helper provides helper
 functions used by Foo and Bar. When I'm packing them into a top mudule P, I
 do not want to expose the functions of Helper to users of P.

 Is there some way to achieve this?  If not, do anyone know of other ways
 for packing libraries and keeping some of the modules private to the
 library?


 Just write yourself a file p.mli without your private modules:
 === p.mli ===
 module Foo : ...
 module Bar : ...
 ==
 Of course, you can not refer to signatures of modules Foo and Bar in
 p.mli. Thus you have to duplicate them or, better, to write them somewhere
 outside the package.

 From a compilation point of view, be sure to generate p.cmi by using p.mli
 before generating the pack files p.cm[ox].

 We use such a trick in the Frama-C tool (http://frama-c.com) for
 providing (usually empty) interfaces of its plug-ins. But I do not recommend
 you to read the Frama-C Makefiles for looking at the corresponding
 compilation lines (except if you are **very** motivated).

 Hope this helps,
 Julien



 ___
 Caml-list mailing list. Subscription management:
 http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
 Archives: http://caml.inria.fr
 Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
 Bug reports: http://caml.inria.fr/bin/caml-bugs


___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Julien Signoles
Hello,

2010/5/21 Ashish Agarwal agarwal1...@gmail.com

  write a script to generate the P.mli file

 Why do you need Bar.mli and Foo.mli at all? Just write the P.mli only.


If your pack is big, you may want to mask internals of Bar and Foo to others
modules of the pack. Actually, values exported in Bar/Foo but not in P
exactly are the module counterparts of friend methods in OO languages.

--
Julien
___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Goswin von Brederlow
Julien Signoles julien.signo...@gmail.com writes:

 Hello,

 2010/5/21 Ashish Agarwal agarwal1...@gmail.com

  write a script to generate the P.mli file

 Why do you need Bar.mli and Foo.mli at all? Just write the P.mli only.


 If your pack is big, you may want to mask internals of Bar and Foo to others
 modules of the pack. Actually, values exported in Bar/Foo but not in P exactly
 are the module counterparts of friend methods in OO languages.

But then, if you have methods in Bar and Foo visible inside the pack but
not from outside, you can't just cat Bar.mli and Foo.mli into
P.mli. You need to process it to remove the 'friends' functions.

Doesn't batteries have some script for this?

MfG
Goswin

___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs


Re: [Caml-list] Private modules in packages

2010-05-21 Thread Julien Signoles
2010/5/21 Goswin von Brederlow goswin-...@web.de

 Julien Signoles julien.signo...@gmail.com writes:

  Hello,
 
  2010/5/21 Ashish Agarwal agarwal1...@gmail.com
 
   write a script to generate the P.mli file
 
  Why do you need Bar.mli and Foo.mli at all? Just write the P.mli
 only.
 
 
  If your pack is big, you may want to mask internals of Bar and Foo to
 others
  modules of the pack. Actually, values exported in Bar/Foo but not in P
 exactly
  are the module counterparts of friend methods in OO languages.

 But then, if you have methods in Bar and Foo visible inside the pack but
 not from outside, you can't just cat Bar.mli and Foo.mli into
 P.mli. You need to process it to remove the 'friends' functions.


You can do something like that (pure ocaml without any external script):

=== file baz.mli (outside the pack P) ===
module type Foo = sig ... (* my public values here *) end

=== file p.mli ===
module Foo: Baz.Foo

=== file foo.mli ===
include Baz.Foo
... (* my friend values *)

=== file foo.ml ===
... (* all my internals: defining my public+friends+private values *)

Hope this helps,
Julien
___
Caml-list mailing list. Subscription management:
http://yquem.inria.fr/cgi-bin/mailman/listinfo/caml-list
Archives: http://caml.inria.fr
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
Bug reports: http://caml.inria.fr/bin/caml-bugs