837 ensure_stmt Constant stmt_value @{const_name Pure.dummy_pattern} |
837 ensure_stmt Constant stmt_value @{const_name Pure.dummy_pattern} |
838 #> snd |
838 #> snd |
839 #> term_value |
839 #> term_value |
840 end; |
840 end; |
841 |
841 |
842 fun dynamic_evaluator ctxt evaluator algebra eqngr t = |
842 fun dynamic_evaluation eval ctxt algebra eqngr t = |
843 let |
843 let |
844 val ((program, (vs_ty_t', deps)), _) = |
844 val ((program, (vs_ty_t', deps)), _) = |
845 invoke_generation false (Proof_Context.theory_of ctxt) (algebra, eqngr) ensure_value t; |
845 invoke_generation false (Proof_Context.theory_of ctxt) |
846 in evaluator program t vs_ty_t' deps end; |
846 (algebra, eqngr) ensure_value t; |
|
847 in eval program t vs_ty_t' deps end; |
847 |
848 |
848 fun dynamic_conv ctxt conv = |
849 fun dynamic_conv ctxt conv = |
849 Code_Preproc.dynamic_conv ctxt (dynamic_evaluator ctxt (fn program => fn _ => conv program)); |
850 Code_Preproc.dynamic_conv ctxt |
850 |
851 (dynamic_evaluation (fn program => fn _ => conv program) ctxt); |
851 fun dynamic_value ctxt postproc evaluator = |
852 |
852 Code_Preproc.dynamic_value ctxt postproc (dynamic_evaluator ctxt evaluator); |
853 fun dynamic_value ctxt postproc comp = |
853 |
854 Code_Preproc.dynamic_value ctxt postproc |
854 fun static_subevaluator ctxt subevaluator algebra eqngr program t = |
855 (dynamic_evaluation comp ctxt); |
855 let |
856 |
856 val ((_, ((vs_ty', t'), deps)), _) = |
857 fun static_evaluation ctxt consts algebra eqngr static_eval = |
857 ensure_value ctxt algebra eqngr t ([], program); |
|
858 in subevaluator ctxt t (vs_ty', t') deps end; |
|
859 |
|
860 fun static_evaluator_thingol ctxt evaluator consts { algebra, eqngr } = |
|
861 let |
858 let |
862 fun generate_consts ctxt algebra eqngr = |
859 fun generate_consts ctxt algebra eqngr = |
863 fold_map (ensure_const ctxt algebra eqngr false); |
860 fold_map (ensure_const ctxt algebra eqngr false); |
864 val (deps, program) = |
861 val (deps, program) = |
865 invoke_generation true (Proof_Context.theory_of ctxt) (algebra, eqngr) generate_consts consts; |
862 invoke_generation true (Proof_Context.theory_of ctxt) |
866 val subevaluator = evaluator { program = program, deps = deps }; |
863 (algebra, eqngr) generate_consts consts; |
867 in fn ctxt' => static_subevaluator ctxt' subevaluator algebra eqngr program end; |
864 in static_eval { program = program, deps = deps } end; |
868 |
865 |
869 fun static_evaluator_isa ctxt evaluator consts { algebra, eqngr } = |
866 fun static_evaluation_thingol ctxt consts algebra eqngr static_eval = |
870 let |
867 let |
871 fun generate_consts ctxt algebra eqngr = |
868 fun evaluation' program dynamic_eval ctxt t = |
872 fold_map (ensure_const ctxt algebra eqngr false); |
869 let |
873 val (_, program) = |
870 val ((_, ((vs_ty', t'), deps)), _) = |
874 invoke_generation true (Proof_Context.theory_of ctxt) (algebra, eqngr) generate_consts consts; |
871 ensure_value ctxt algebra eqngr t ([], program); |
875 in evaluator (program: program) end; |
872 in dynamic_eval ctxt t (vs_ty', t') deps end; |
|
873 fun evaluation static_eval { program, deps } = |
|
874 evaluation' program (static_eval { program = program, deps = deps }); |
|
875 in |
|
876 static_evaluation ctxt consts algebra eqngr |
|
877 (evaluation static_eval) |
|
878 end; |
|
879 |
|
880 fun static_evaluation_isa ctxt consts algebra eqngr static_eval = |
|
881 static_evaluation ctxt consts algebra eqngr |
|
882 (fn { program, ... } => static_eval (program: program)); |
876 |
883 |
877 fun static_conv_thingol (ctxt_consts as { ctxt, consts }) conv = |
884 fun static_conv_thingol (ctxt_consts as { ctxt, consts }) conv = |
878 Code_Preproc.static_conv ctxt_consts (static_evaluator_thingol ctxt (K oo conv) consts); |
885 Code_Preproc.static_conv ctxt_consts (fn { algebra, eqngr } => |
|
886 static_evaluation_thingol ctxt consts algebra eqngr (K oo conv)); |
879 |
887 |
880 fun static_conv_isa (ctxt_consts as { ctxt, consts }) conv = |
888 fun static_conv_isa (ctxt_consts as { ctxt, consts }) conv = |
881 Code_Preproc.static_conv ctxt_consts (static_evaluator_isa ctxt conv consts); |
889 Code_Preproc.static_conv ctxt_consts (fn { algebra, eqngr } => |
882 |
890 static_evaluation_isa ctxt consts algebra eqngr conv); |
883 fun static_value (ctxt_postproc_consts as { ctxt, consts, ... }) evaluator = |
891 |
884 Code_Preproc.static_value ctxt_postproc_consts (static_evaluator_thingol ctxt evaluator consts); |
892 fun static_value (ctxt_postproc_consts as { ctxt, consts, ... }) comp = |
|
893 Code_Preproc.static_value ctxt_postproc_consts (fn { algebra, eqngr } => |
|
894 static_evaluation_thingol ctxt consts algebra eqngr comp); |
885 |
895 |
886 |
896 |
887 (** constant expressions **) |
897 (** constant expressions **) |
888 |
898 |
889 fun read_const_exprs_internal ctxt = |
899 fun read_const_exprs_internal ctxt = |