diff options
| author | Pierre Letouzey | 2018-04-04 10:43:38 +0200 |
|---|---|---|
| committer | Jason Gross | 2018-08-31 20:05:53 -0400 |
| commit | b3c75936a4912ca794cdcecfeb92044552336c63 (patch) | |
| tree | 7e612dd15ea6f36285ab431d1e1667cb399da3a1 /plugins/syntax/n_syntax.ml | |
| parent | 93119295d0dd81669b46f52032c1bfe8f36afca0 (diff) | |
prim notations backtrackable, their declarations now in two parts (API change)
The first part (e.g. register_bignumeral_interpretation) deals only with
the interp/uninterp closures. It should typically be done as a side
effect during a syntax plugin loading. No prim notation are active yet
after this phase.
The second part (enable_prim_token_interpretation) activates the prim
notation. It is now correctly talking to Summary and to the LibStack.
To avoid "phantom" objects in libstack after a mere Require, this
second part should be done inside a Mltop.declare_cache_obj
The link between the two parts is a prim_token_uid (a string), which
should be unique for each primitive notation. When this primitive
notation is specific to a scope, the scope_name could be used as uid.
Btw, the list of "patterns" for detecting when an uninterpreter should
be considered is now restricted to a list of global_reference
(inductive constructors, or injection functions such as IZR).
The earlier API was accepting a glob_constr list, but was actually
only working well for global_reference.
A minimal compatibility is provided (declare_numeral_interpreter),
but is discouraged, since it is known to store uncessary objects
in the libstack.
Diffstat (limited to 'plugins/syntax/n_syntax.ml')
| -rw-r--r-- | plugins/syntax/n_syntax.ml | 21 |
1 files changed, 14 insertions, 7 deletions
diff --git a/plugins/syntax/n_syntax.ml b/plugins/syntax/n_syntax.ml index 0e202be47f..29b88b1cb3 100644 --- a/plugins/syntax/n_syntax.ml +++ b/plugins/syntax/n_syntax.ml @@ -72,10 +72,17 @@ let uninterp_n (AnyGlobConstr p) = (************************************************************************) (* Declaring interpreters and uninterpreters for N *) -let _ = Notation.declare_numeral_interpreter "N_scope" - (n_path,binnums) - n_of_int - ([DAst.make @@ GRef (glob_N0, None); - DAst.make @@ GRef (glob_Npos, None)], - uninterp_n, - true) +open Notation + +let at_declare_ml_module f x = + Mltop.declare_cache_obj (fun () -> f x) __coq_plugin_name + +let _ = + let scope = "N_scope" in + register_bignumeral_interpretation scope (n_of_int,uninterp_n); + at_declare_ml_module enable_prim_token_interpretation + { pt_scope = scope; + pt_uid = scope; + pt_required = (n_path,binnums); + pt_refs = [glob_N0; glob_Npos]; + pt_in_match = true } |
