src/Tools/Code/code_thingol.ML
changeset 63157 65a81a4ef7f8
parent 63156 3cb84e4469a7
child 63159 84c6dd947b75
equal deleted inserted replaced
63156:3cb84e4469a7 63157:65a81a4ef7f8
   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 =