From bd7da353ea503423206e329af7a56174cb39f435 Mon Sep 17 00:00:00 2001 From: ppedrot Date: Fri, 21 Jun 2013 21:04:00 +0000 Subject: Splitted up Genarg in four different levels: 1. Genarg itself which only defines the abstract datatypes needed. 2. Genintern, first file of interp/, defining the intern and subst functions. 3. Geninterp, first file of tactics/, defining the interp function. 4. Genprint, first file of printing/, dealing with the printers. The Genarg file has no dependency and is in lib/, so that we can put generic arguments everywhere, and in particular in ASTs. git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/coq/trunk@16601 85f007b7-540e-0410-9357-904b9bb8a0f7 --- interp/genintern.ml | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 interp/genintern.ml (limited to 'interp/genintern.ml') diff --git a/interp/genintern.ml b/interp/genintern.ml new file mode 100644 index 000000000..00ea3a71b --- /dev/null +++ b/interp/genintern.ml @@ -0,0 +1,82 @@ +(************************************************************************) +(* v * The Coq Proof Assistant / The Coq Development Team *) +(* 'raw -> glob_sign * 'glb +type 'glb subst_fun = substitution -> 'glb -> 'glb + +let arg0_intern_map = + ref (String.Map.empty : (Obj.t, Obj.t) intern_fun String.Map.t) +let arg0_subst_map = + ref (String.Map.empty : Obj.t subst_fun String.Map.t) + +let get_intern0 name = + try String.Map.find name !arg0_intern_map + with Not_found -> + Errors.anomaly (str "intern0 function not found: " ++ str name) + +let get_subst0 name = + try String.Map.find name !arg0_subst_map + with Not_found -> + Errors.anomaly (str "subst0 function not found: " ++ str name) + +(** For now, the following functions are quite dummy and should only be applied + to an extra argument type, otherwise, they will badly fail. *) + +let rec obj_intern t = match t with +| ExtraArgType s -> get_intern0 s +| _ -> assert false + +let intern t = Obj.magic (obj_intern (unquote (rawwit t))) + +let generic_intern ist v = + let t = genarg_tag v in + let (ist, ans) = obj_intern t ist (Unsafe.prj v) in + (ist, Unsafe.inj t ans) + +(** Substitution functions *) + +let rec obj_substitute t = match t with +| ExtraArgType s -> get_subst0 s +| _ -> assert false + +let substitute t = Obj.magic (obj_substitute (unquote (rawwit t))) + +let generic_substitute subs v = + let t = genarg_tag v in + let ans = obj_substitute t subs (Unsafe.prj v) in + Unsafe.inj t ans + +(** Registering functions *) + +let register_intern0 arg f = match unquote (rawwit arg) with +| ExtraArgType s -> + if String.Map.mem s !arg0_intern_map then + Errors.anomaly (str "intern0 function already registered: " ++ str s) + else + arg0_intern_map := String.Map.add s (Obj.magic f) !arg0_intern_map +| _ -> assert false + +let register_subst0 arg f = match unquote (rawwit arg) with +| ExtraArgType s -> + if String.Map.mem s !arg0_subst_map then + Errors.anomaly (str "subst0 function already registered: " ++ str s) + else + arg0_subst_map := String.Map.add s (Obj.magic f) !arg0_subst_map +| _ -> assert false -- cgit v1.2.3