Browse thread
Nesting Modules
[
Home
]
[ Index:
by date
|
by threads
]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
[ Message by date: previous | next ] [ Message in thread: previous | next ] [ Thread: previous | next ]
| Date: | -- (:) |
| From: | Gerd Stolpmann <info@g...> |
| Subject: | Re: [Caml-list] Nesting Modules |
Sorry, but this is not a good solution. The leaves are only hidden from
the user, but can still cause nameclashes. (E.g. if one adds another
Leaf1 module later.)
The proper solution is to use -pack (and -for-pack in O'Caml 3.09):
ocamlc -o branch2.cmo -pack leaf2.cmo leaf3.cmo
ocamlc -o branch1.cmo -pack leaf1.cmo brachch2.cmo
Then throw away leaf*.{cmi,cmo} and branch2.{cmi,cmo}. Everything is now
in branch1.{cmi,cmo}.
For O'Caml 3.09 and ocamlopt, you need to add the right -for-pack
options, e.g.
ocamlopt -for-pack Branch1.Branch2 -c leaf2.ml
ocamlopt -for-pack Branch1.Branch2 -c leaf3.ml
ocamlopt -for-pack Branch1 -c leaf1.ml
ocamlopt -o branch2.cmx -pack -for-pack Branch1 leaf2.cmx leaf3.cmx
ocamlopt -o branch1.cmx -pack leaf1.cmx branch2.cmx
For O'Caml 3.08 and ocamlopt, you need GNU objcopy, but no extra
-for-pack options.
Gerd
Am Mittwoch, den 02.11.2005, 08:02 -0600 schrieb Tom Hawkins:
> I found a convenient way to compose a set modules into a hierarchical
> library. First define the set of modules (ml/mli file pairs) -- these
> become the leaves in the module tree. Next, define the branch modules
> in the hierarchy using "module Leaf = Leaf" (ml only, no mli). Then
> compile and link. The only restriction is that all functional code must
> reside in leaf modules. Here's an example...
>
> # Define the leaf modules.
> echo 'let name = "leaf1"' > leaf1.ml
> echo 'val name : string' > leaf1.mli
> echo 'let name = "leaf2"' > leaf2.ml
> echo 'val name : string' > leaf2.mli
> echo 'let name = "leaf3"' > leaf3.ml
> echo 'val name : string' > leaf3.mli
>
> # Define the branch modules.
> echo 'module Leaf2 = Leaf2;; module Leaf3 = Leaf3' > branch2.ml
> echo 'module Leaf1 = Leaf1;; module Branch2 = Branch2' > branch1.ml
>
> # Compile all leaf modules.
> ocamlc -c leaf1.mli
> ocamlc -c leaf1.ml
> ocamlc -c leaf2.mli
> ocamlc -c leaf2.ml
> ocamlc -c leaf3.mli
> ocamlc -c leaf3.ml
>
> # Compile all branch modules.
> ocamlc -c branch2.ml
> ocamlc -c branch1.ml
>
> # Link the library.
> ocamlc -a -o branch1.cma leaf1.cmo leaf2.cmo leaf3.cmo branch2.cmo
> branch1.cmo
>
> # Delete all *.cmi files except top.
> rm leaf*.cmi
> rm branch2.cmi
>
> # Run.
> ocaml branch1.cma
>
> Objective Caml version 3.09.0
>
> # Branch1.Branch2.Leaf3.name;;
> - : string = "leaf3"
>
>
>
>
> Thanks for everyone's help!
>
> -Tom
>
> _______________________________________________
> 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
>
--
------------------------------------------------------------
Gerd Stolpmann * Viktoriastr. 45 * 64293 Darmstadt * Germany
gerd@gerd-stolpmann.de http://www.gerd-stolpmann.de
Telefon: 06151/153855 Telefax: 06151/997714
------------------------------------------------------------