I've often wondered why languages don't support "extensions" to library
namespaces (and perhaps even to functors). e.g. one could define
let String.explode s = ....
let String.implode s = ...
let myfun = ...
If you like you can consider this as a shorthand for the longwinded
declaration of a module and the rebinding of member names. Since all the
typing mechanisms are "monotonic" w.r.t. adding new members to a module
(i.e. if a module matched a signature before it will continue to match after
an addition like the above) then this should make sense theoretically. The
implementation can probably just whack in another element to the dictionary
structure that represents a module.
The "signature" of a seperately compilation unit would probably have to
declare how the unit extends existing structures, functors and signatures,
e.g. the .mli for the above code might be:
val String.explode : string -> char list
val String.implode : char list -> string
val myfun : int -> int
I put "signature" in quotes because the extensions are not part of signature
of the module defined by the unit itself (i.e. the rule "each compilation
unit introduces one new top level module" would be relaxed.
You then probably need a distinction between "open" and "load", i.e. open a
top level module namespace and load a compilation unit, and you probably
need to explicitly load any compilation units that define extensions (rather
than relying on the default behaviour of OCaml where a compilation unit is
"loaded" by virtue of using a module access, e.g. Myfile.myfun). For
example:
(A) open Myfile (* myfun now in scope *)
(B) load Myfile (* String.explode, String.implode, Myfun.myfun now in
scope. *)
open Myfile (* myfile becomes available *)
(B) Myfile.myfile (* OK - but String.explode not available without an *)
(* explicit load *)
I think that with that distinction in place dependency analysis would be OK.
More ambitiously, perhaps one could even extend functors coherently in this
way, i.e.
let Set.Make(Ord: OrderedType).set_exists = ...
Realistically you probably need a way of accessing the existing elements
generated by the application, which we could do by reusing my favourite
keyword "as".... e.g
let (Set.Make(Ord: OrderedType) as M).set_exists = ...
try M.fold (fun x _ -> if p x then failwith "t") s (); false
with Failure "t" -> true
This is all quite similar to the mechanisms I used for the module mechanism
in my theorem prover "Declare", which didn't have functors as such, but even
the basic mechanisms certainly did make the abstract algebra examples I did
look quite nice.
Don
P.S. I don't know if you could also add types to modules in this way?
-----Original Message-----
From: Jerome Vouillon [mailto:Jerome.Vouillon@inria.fr]
Sent: 13 March 2000 09:26
To: caml-redistribution@pauillac.inria.fr
Subject: Re: additions to standard library?
On Tue, Mar 07, 2000 at 04:24:00PM +0100, Markus Mottl wrote:
> What do you think about the idea to make use of the "usercontrib"
> CVS-repository at INRIA for such purposes? We could open a "stable" and
> "development" branch for standard libraries (and "otherlibs") there, where
> people could place and "peer review" their contributions. From time to
> time, the OCaml-team can peek at the additions and take what they consider
> useful.
I see two dangers:
- this could result in an over-featured library;
- the "regular" and the "extended" library may diverge.
On the other hand, I don't think it would be a bad thing if more
people contributed to the development of O'Caml.
Anyway, you can always set up a repository on Sourceforge or any
similar site and see what happens. :-)
-- Jérôme
This archive was generated by hypermail 2b29 : Tue Mar 21 2000 - 14:56:01 MET