src/Tools/Code/code_thingol.ML
changeset 56973 62da80041afd
parent 56969 7491932da574
child 58397 1c036d6216d3
equal deleted inserted replaced
56972:f64730f667b9 56973:62da80041afd
    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 =