From: Jesse G. <je...@wi...> - 2004-08-15 17:01:18
|
Jesse Guardiani wrote: > On Sunday 15 August 2004 06:31, Nicolas Cannasse wrote: > > [...] > >> > I like the data hiding that objects provide. The above module you have >> > defined is only good for a local fabricated environment. >> >> That's were the devil is hidding. >> You should actually treat uniformaly any environement, local or "built". >> I makes things a lot easier, especially when for example you start >> writting code modifying your local env and you want to switch later to >> "built" env for different kind of reasons. You shouldn't rewrite anything >> this time. Here's an improved interface : >> >> type t = (string , string ) Hashtbl.t >> >> val get : t -> string -> string option >> val default : t -> def:string -> env:string -> string >> val put : t -> string -> string -> unit >> val exists : t -> string -> bool >> >> val process : unit -> t (* return the current process env *) >> val dup : t -> t (* duplicate an environement (can be useful) *) >> val to_array : t -> string array >> var set : t -> unit (* set the current process env *) > > I like this interface, but the more I play with it the more I realize that > we're still wrapping Hashtbl. The entire interface can be reduced to this: > > val process : ?size:int -> unit -> (string, string) Hashtbl.t > val to_array : (string, string) Hashtbl.t -> string array > val set : (string, string) Hashtbl.t -> string -> unit > > There's no need for an additional type. I've implemented this, as well as the get, strict_get, default, and put functions. I justified implementing these by restricting their type arguments, and causing the get like functions to raise Invalid_argument instead of Not_found for a bit more detailed exceptions: sig val from_array : ?size:int -> string array -> (string, string) Hashtbl.t val process : ?size:int -> unit -> (string, string) Hashtbl.t val to_array : (string, string) Hashtbl.t -> string array val set : (string, string) Hashtbl.t -> string -> unit val get : (string, string) Hashtbl.t -> string -> string val strict_get : (string, string) Hashtbl.t -> string -> string val default : ?def:string -> (string, string) Hashtbl.t -> string -> string val put : (string, string) Hashtbl.t -> string -> string -> unit end It compiles, but I haven't tested it yet. :) Consider it just a proof of concept for now until I can thoroughly test it later today. You can check it out here: http://www.wingnet.net/~jesse/ocaml/env/doc/Env.html Click the (.ml) at the top to view the full source. What does everyone think? -- Jesse Guardiani, Systems Administrator WingNET Internet Services, P.O. Box 2605 // Cleveland, TN 37320-2605 423-559-LINK (v) 423-559-5145 (f) http://www.wingnet.net |