89 -> typscheme * iterm -> Code_Symbol.T list -> conv) |
89 -> typscheme * iterm -> Code_Symbol.T list -> conv) |
90 -> conv |
90 -> conv |
91 val dynamic_value: Proof.context -> ((term -> term) -> 'a -> 'a) -> (program |
91 val dynamic_value: Proof.context -> ((term -> term) -> 'a -> 'a) -> (program |
92 -> term -> typscheme * iterm -> Code_Symbol.T list -> 'a) |
92 -> term -> typscheme * iterm -> Code_Symbol.T list -> 'a) |
93 -> term -> 'a |
93 -> term -> 'a |
94 val static_conv: Proof.context -> string list -> (program -> string list |
94 val static_conv: { ctxt: Proof.context, consts: string list } |
95 -> Proof.context -> typscheme * iterm -> Code_Symbol.T list -> conv) |
95 -> ({ program: program, deps: string list } |
|
96 -> Proof.context -> typscheme * iterm -> Code_Symbol.T list -> conv) |
96 -> Proof.context -> conv |
97 -> Proof.context -> conv |
97 val static_conv_simple: Proof.context -> string list |
98 val static_conv_simple: { ctxt: Proof.context, consts: string list } |
98 -> (program -> Proof.context -> term -> conv) |
99 -> (program -> Proof.context -> term -> conv) |
99 -> Proof.context -> conv |
100 -> Proof.context -> conv |
100 val static_value: Proof.context -> ((term -> term) -> 'a -> 'a) -> string list -> |
101 val static_value: { ctxt: Proof.context, lift_postproc: ((term -> term) -> 'a -> 'a), consts: string list } |
101 (program -> string list |
102 -> ({ program: program, deps: string list } |
102 -> Proof.context -> term -> typscheme * iterm -> Code_Symbol.T list -> 'a) |
103 -> Proof.context -> term -> typscheme * iterm -> Code_Symbol.T list -> 'a) |
103 -> Proof.context -> term -> 'a |
104 -> Proof.context -> term -> 'a |
104 end; |
105 end; |
105 |
106 |
106 structure Code_Thingol: CODE_THINGOL = |
107 structure Code_Thingol: CODE_THINGOL = |
839 let |
840 let |
840 val ((_, ((vs_ty', t'), deps)), _) = |
841 val ((_, ((vs_ty', t'), deps)), _) = |
841 ensure_value ctxt algebra eqngr t ([], program); |
842 ensure_value ctxt algebra eqngr t ([], program); |
842 in subevaluator ctxt t (vs_ty', t') deps end; |
843 in subevaluator ctxt t (vs_ty', t') deps end; |
843 |
844 |
844 fun static_evaluator ctxt evaluator consts algebra eqngr = |
845 fun static_evaluator ctxt evaluator consts { algebra, eqngr } = |
845 let |
846 let |
846 fun generate_consts ctxt algebra eqngr = |
847 fun generate_consts ctxt algebra eqngr = |
847 fold_map (ensure_const ctxt algebra eqngr false); |
848 fold_map (ensure_const ctxt algebra eqngr false); |
848 val (consts', program) = |
849 val (deps, program) = |
849 invoke_generation true (Proof_Context.theory_of ctxt) (algebra, eqngr) generate_consts consts; |
850 invoke_generation true (Proof_Context.theory_of ctxt) (algebra, eqngr) generate_consts consts; |
850 val subevaluator = evaluator program consts'; |
851 val subevaluator = evaluator { program = program, deps = deps }; |
851 in fn ctxt' => static_subevaluator ctxt' subevaluator algebra eqngr program end; |
852 in fn ctxt' => static_subevaluator ctxt' subevaluator algebra eqngr program end; |
852 |
853 |
853 fun static_evaluator_simple ctxt evaluator consts algebra eqngr = |
854 fun static_evaluator_simple ctxt evaluator consts { algebra, eqngr } = |
854 let |
855 let |
855 fun generate_consts ctxt algebra eqngr = |
856 fun generate_consts ctxt algebra eqngr = |
856 fold_map (ensure_const ctxt algebra eqngr false); |
857 fold_map (ensure_const ctxt algebra eqngr false); |
857 val (_, program) = |
858 val (_, program) = |
858 invoke_generation true (Proof_Context.theory_of ctxt) (algebra, eqngr) generate_consts consts; |
859 invoke_generation true (Proof_Context.theory_of ctxt) (algebra, eqngr) generate_consts consts; |
859 in evaluator program end; |
860 in evaluator (program: program) end; |
860 |
861 |
861 fun static_conv ctxt consts conv = |
862 fun static_conv (ctxt_consts as { ctxt, consts }) conv = |
862 Code_Preproc.static_conv ctxt consts (static_evaluator ctxt (fn program => fn deps => |
863 Code_Preproc.static_conv ctxt_consts (static_evaluator ctxt (K oo conv) consts); |
863 let val conv' = conv program deps in fn ctxt => fn _ => conv' ctxt end) consts); |
864 |
864 |
865 fun static_conv_simple (ctxt_consts as { ctxt, consts }) conv = |
865 fun static_conv_simple ctxt consts conv = |
866 Code_Preproc.static_conv ctxt_consts (static_evaluator_simple ctxt conv consts); |
866 Code_Preproc.static_conv ctxt consts (static_evaluator_simple ctxt conv consts); |
867 |
867 |
868 fun static_value (ctxt_postproc_consts as { ctxt, consts, ... }) evaluator = |
868 fun static_value ctxt postproc consts evaluator = |
869 Code_Preproc.static_value ctxt_postproc_consts (static_evaluator ctxt evaluator consts); |
869 Code_Preproc.static_value ctxt postproc consts (static_evaluator ctxt evaluator consts); |
|
870 |
870 |
871 |
871 |
872 (** constant expressions **) |
872 (** constant expressions **) |
873 |
873 |
874 fun read_const_exprs_internal ctxt = |
874 fun read_const_exprs_internal ctxt = |