[Caml-list] Private modules in packages
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
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
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
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
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
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
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/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