RE: additions to standard library?

From: Don Syme (dsyme@microsoft.com)
Date: Tue Mar 14 2000 - 18:24:16 MET

  • Next message: Jacques Garrigue: "Re: Syntax for label, NEW PROPOSAL"

    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