| author | nipkow | 
| Mon, 17 Sep 2018 19:21:39 +0200 | |
| changeset 69006 | e2d573447efd | 
| parent 67505 | ceb324e34c14 | 
| child 69592 | a80d8ec6c998 | 
| permissions | -rw-r--r-- | 
| 63806 | 1 | (* Title: HOL/Tools/value_command.ML | 
| 28227 | 2 | Author: Florian Haftmann, TU Muenchen | 
| 3 | ||
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 4 | Generic value command for arbitrary evaluators, with default using nbe or SML. | 
| 28227 | 5 | *) | 
| 6 | ||
| 63806 | 7 | signature VALUE_COMMAND = | 
| 28227 | 8 | sig | 
| 9 | val value: Proof.context -> term -> term | |
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 10 | val value_select: string -> Proof.context -> term -> term | 
| 67330 | 11 | val value_cmd: xstring -> string list -> string -> Toplevel.state -> unit | 
| 12 | val add_evaluator: binding * (Proof.context -> term -> term) | |
| 13 | -> theory -> string * theory | |
| 28227 | 14 | end; | 
| 15 | ||
| 63806 | 16 | structure Value_Command : VALUE_COMMAND = | 
| 28227 | 17 | struct | 
| 18 | ||
| 67330 | 19 | structure Evaluators = Theory_Data | 
| 20 | ( | |
| 21 | type T = (Proof.context -> term -> term) Name_Space.table; | |
| 22 | val empty = Name_Space.empty_table "evaluator"; | |
| 23 | val extend = I; | |
| 24 | val merge = Name_Space.merge_tables; | |
| 25 | ) | |
| 26 | ||
| 27 | fun add_evaluator (b, evaluator) thy = | |
| 28 | let | |
| 29 | val (name, tab') = Name_Space.define (Context.Theory thy) true | |
| 30 | (b, evaluator) (Evaluators.get thy); | |
| 31 | val thy' = Evaluators.put tab' thy; | |
| 32 | in (name, thy') end; | |
| 33 | ||
| 34 | fun intern_evaluator ctxt raw_name = | |
| 35 | if raw_name = "" then "" | |
| 36 | else Name_Space.intern (Name_Space.space_of_table | |
| 37 | (Evaluators.get (Proof_Context.theory_of ctxt))) raw_name; | |
| 38 | ||
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 39 | fun default_value ctxt t = | 
| 56927 | 40 | if null (Term.add_frees t []) | 
| 66345 
882abe912da9
do not fall back on nbe if plain evaluation fails
 haftmann parents: 
63806diff
changeset | 41 | then Code_Evaluation.dynamic_value_strict ctxt t | 
| 56927 | 42 | else Nbe.dynamic_value ctxt t; | 
| 28227 | 43 | |
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 44 | fun value_select name ctxt = | 
| 67330 | 45 | if name = "" | 
| 46 | then default_value ctxt | |
| 47 | else Name_Space.get (Evaluators.get (Proof_Context.theory_of ctxt)) name ctxt; | |
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 48 | |
| 67330 | 49 | val value = value_select ""; | 
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 50 | |
| 67330 | 51 | fun value_cmd raw_name modes raw_t state = | 
| 28227 | 52 | let | 
| 53 | val ctxt = Toplevel.context_of state; | |
| 67330 | 54 | val name = intern_evaluator ctxt raw_name; | 
| 28227 | 55 | val t = Syntax.read_term ctxt raw_t; | 
| 67330 | 56 | val t' = value_select name ctxt t; | 
| 28227 | 57 | val ty' = Term.type_of t'; | 
| 31218 | 58 | val ctxt' = Variable.auto_fixes t' ctxt; | 
| 37146 
f652333bbf8e
renamed structure PrintMode to Print_Mode, keeping the old name as legacy alias for some time;
 wenzelm parents: 
36960diff
changeset | 59 | val p = Print_Mode.with_modes modes (fn () => | 
| 28227 | 60 | Pretty.block [Pretty.quote (Syntax.pretty_term ctxt' t'), Pretty.fbrk, | 
| 61 | Pretty.str "::", Pretty.brk 1, Pretty.quote (Syntax.pretty_typ ctxt' ty')]) (); | |
| 62 | in Pretty.writeln p end; | |
| 63 | ||
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
33522diff
changeset | 64 | val opt_modes = | 
| 67149 | 65 | Scan.optional (\<^keyword>\<open>(\<close> |-- Parse.!!! (Scan.repeat1 Parse.name --| \<^keyword>\<open>)\<close>)) []; | 
| 28227 | 66 | |
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 67 | val opt_evaluator = | 
| 67330 | 68 | Scan.optional (\<^keyword>\<open>[\<close> |-- Parse.name --| \<^keyword>\<open>]\<close>) ""; | 
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 69 | |
| 36960 
01594f816e3a
prefer structure Keyword, Parse, Parse_Spec, Outer_Syntax;
 wenzelm parents: 
33522diff
changeset | 70 | val _ = | 
| 67149 | 71 | Outer_Syntax.command \<^command_keyword>\<open>value\<close> "evaluate and print term" | 
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 72 | (opt_evaluator -- opt_modes -- Parse.term | 
| 67330 | 73 | >> (fn ((name, modes), t) => Toplevel.keep (value_cmd name modes t))); | 
| 28227 | 74 | |
| 59323 | 75 | val _ = Theory.setup | 
| 67463 | 76 | (Thy_Output.antiquotation_pretty_source \<^binding>\<open>value\<close> | 
| 58100 
f54a8a4134d3
restored generic value slot, retaining default behaviour and separate approximate command
 haftmann parents: 
56975diff
changeset | 77 | (Scan.lift opt_evaluator -- Term_Style.parse -- Args.term) | 
| 67463 | 78 | (fn ctxt => fn ((name, style), t) => | 
| 67505 
ceb324e34c14
clarified signature: items with \isasep are special;
 wenzelm parents: 
67463diff
changeset | 79 | Thy_Output.pretty_term ctxt (style (value_select name ctxt t))) | 
| 67330 | 80 | #> add_evaluator (\<^binding>\<open>simp\<close>, Code_Simp.dynamic_value) #> snd | 
| 81 | #> add_evaluator (\<^binding>\<open>nbe\<close>, Nbe.dynamic_value) #> snd | |
| 82 | #> add_evaluator (\<^binding>\<open>code\<close>, Code_Evaluation.dynamic_value_strict) #> snd); | |
| 43612 | 83 | |
| 28227 | 84 | end; |