From mboxrd@z Thu Jan 1 00:00:00 1970 Received: (from majordomo@localhost) by pauillac.inria.fr (8.7.6/8.7.3) id BAA08208; Sat, 2 Nov 2002 01:21:34 +0100 (MET) X-Authentication-Warning: pauillac.inria.fr: majordomo set sender to owner-caml-list@pauillac.inria.fr using -f Received: from nez-perce.inria.fr (nez-perce.inria.fr [192.93.2.78]) by pauillac.inria.fr (8.7.6/8.7.3) with ESMTP id BAA07769 for ; Sat, 2 Nov 2002 01:21:33 +0100 (MET) Received: from [192.168.2.13] (as5300.kharkov.ukrtel.net [195.5.1.188]) by nez-perce.inria.fr (8.11.1/8.11.1) with ESMTP id gA20L8D10077 for ; Sat, 2 Nov 2002 01:21:08 +0100 (MET) Received: from yrashk by openeas.org with local (masqmail 0.2.6) id 187m5w-726-00 for ; Sat, 02 Nov 2002 02:24:56 +0200 Date: Sat, 2 Nov 2002 02:24:56 +0200 From: "Yurii A. Rashkovskii" To: caml-list@inria.fr Subject: [Caml-list] module namespace Message-ID: <20021102002456.GC8925@rashko> Mime-Version: 1.0 Content-Type: multipart/signed; micalg=pgp-sha1; protocol="application/pgp-signature"; boundary="cQXOx3fnlpmgJsTP" Content-Disposition: inline User-Agent: Mutt/1.4i Sender: owner-caml-list@pauillac.inria.fr Precedence: bulk --cQXOx3fnlpmgJsTP Content-Type: multipart/mixed; boundary="8NvZYKFJsRX2Djef" Content-Disposition: inline --8NvZYKFJsRX2Djef Content-Type: text/plain; charset=us-ascii Content-Disposition: inline Content-Transfer-Encoding: quoted-printable I've developed small preprocessor module that provides kind of namespace support for the Objective Caml. It defines following constructs: * module ModuleName in [Namespace|Namespace.Namespace] it defines module ModuleName within namespace Examples: module Test in Org.Openeas =3D struct let test =3D () end module Test in Org.Openeas : sig val test:unit end * module type ModuleTypeName in [Namespace|Namespace.Namespace]=20 it defines module type ModuleTypeName within namespace Example: module type T =3D sig val test:unit end * open ModuleName in [Namespace|Namespace.Namespace]=20 it opens module ModuleName from namespace Example: open Unix in Org.Ocaml * open ModuleName in [Namespace|Namespace.Namespace] as NewModuleName=20 the same as previous, but also renames module ModuleName to NewModuleName Example: open Unix in Org.Ocaml as CamlUnix * use [Namespace|Namespace.Namespace] it opens namespace module. If namespace name contains dots, they are replaced with underline. Example: use Org.Openeas If somebody is interested, I want to hear comments, questions, bugs of current implementation and so on.=20 Early source code is attached. --=20 Thanks, Yurii. --8NvZYKFJsRX2Djef Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="pa_ns.ml" Content-Transfer-Encoding: quoted-printable (*******************************************************) (* *) (* OCamlNS *) (* *) (* Copyright (c) 2001, 2002. *) (* E/AS Software Foundation *) (* *) (* Author(s): *) (* Yurii A. Rashkovskii *) (* *) (* This program is free software; you can redistribute *) (* it and/or modify it under the terms of the GNU *) (* Lesser General Public License as published by the *) (* Free Software Foundation; version 2 of the License. *) (* *) (*******************************************************) open Stdpp;; open Pcaml;; let mod_ident =3D Grammar.Entry.create gram "mod_ident";; let module_binding =3D Grammar.Entry.create gram "module_binding";; let rename_module =3D ref (fun loc -> <:str_item< open Pervasives >>);; let gen_mod_name l =3D let nsname =3D ref "" in List.iter (fun x -> nsname :=3D !nsname ^ (x ^ "_")) l ;=20 (String.sub !nsname 0 ((String.length !nsname)-1));; let gen_ns_name l =3D let nsname =3D ref "" in List.iter (fun x -> nsname :=3D !nsname ^ (x ^ "_")) l ; !nsname;; =20 let gen_module loc mn ns me =3D let name =3D "caml_namespace___" ^ (gen_ns_name ns) ^ "__module___" ^ m= n in <:str_item< module $uid:name$ =3D $me$ >> ;; =20 let gen_module_type loc mn ns mt =3D let name =3D "caml_namespace___" ^ (gen_ns_name ns) ^ "__moduletype___"= ^ mn in <:str_item< module type$uid:name$ =3D $mt$ >> ;; =20 let gen_module_open loc mn ns =3D let name =3D "caml_namespace___" ^ (gen_ns_name ns) ^ "__module___" ^ m= n in rename_module :=3D (fun loc -> <:str_item< module $uid:mn$ =3D $uid:nam= e$>>); =20 <:str_item< open $uid:name$>> ;; =20 let gen_module_use loc ns =3D let name =3D (gen_mod_name ns) in <:str_item< open $uid:name$>> ;; =20 let gen_module_open_as loc mn ns asn =3D let name =3D "caml_namespace___" ^ (gen_ns_name ns) ^ "__module___" ^ m= n in rename_module :=3D (fun loc -> <:str_item< module $uid:asn$ =3D $uid:na= me$>>); =20 <:str_item< open $uid:name$>> ;; =20 let gen_module_sig loc mn ns mt =3D let name =3D "caml_namespace___" ^ (gen_ns_name ns) ^ "__module___" ^ m= n in <:sig_item< module $uid:name$ : $mt$ >> ;; =20 EXTEND mod_ident: [ RIGHTA [ i =3D UIDENT -> [i] | i =3D LIDENT -> [i] | i =3D UIDENT; "."; j =3D SELF -> i :: j ] ] ; module_binding: [ RIGHTA [ "("; m =3D UIDENT; ":"; mt =3D module_type; ")"; mb =3D SELF -> <:module_expr< functor ( $m$ : $mt$ ) -> $mb$ >> | ":"; mt =3D module_type; "=3D"; me =3D module_expr -> <:module_expr< ( $me$ : $mt$ ) >> | "=3D"; me =3D module_expr -> <:module_expr< $me$ >> ] ] ; str_item: LEVEL "top" [ [ "module"; i =3D UIDENT; "in" ; ns =3D mod_ident ;=20 me =3D module_binding -> gen_module loc i ns me | "module";"type"; i =3D UIDENT; "in" ; ns =3D mod_ident ; "=3D"; mt =3D module_type -> gen_module_type loc i ns mt |=20 "open"; i =3D UIDENT; "in" ; ns =3D mod_ident -> gen_module_open loc i ns ; !rename_module loc |=20 "open"; i =3D UIDENT; "in" ; ns =3D mod_ident ; "as" ; asn =3D UIDENT = -> gen_module_open_as loc i ns asn; !rename_module loc |=20 "use"; ns =3D mod_ident -> gen_module_use loc ns ] ]; sig_item: LEVEL "top" [ [ "module"; i =3D UIDENT; "in" ; ns =3D mod_ident ; ":" ; mt =3D module= _type -> gen_module_sig loc i ns mt ] ]; END ; --8NvZYKFJsRX2Djef-- --cQXOx3fnlpmgJsTP Content-Type: application/pgp-signature Content-Disposition: inline -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.2.0 (GNU/Linux) iD8DBQE9wxtX/5/+hDnz2cERAscgAJ49swn7u6xHtI+T93HbTNI49lcgPQCfWodQ TU3cHjXb4Ybpxe7rKNzdmrE= =DXMG -----END PGP SIGNATURE----- --cQXOx3fnlpmgJsTP-- ------------------- To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/ Beginner's list: http://groups.yahoo.com/group/ocaml_beginners