src/Tools/Code/code_target.ML
changeset 41364 aaf5968c67ef
parent 41351 e82fc600a3a5
child 41939 eb9fb5a4d27f
equal deleted inserted replaced
41351:e82fc600a3a5 41364:aaf5968c67ef
   408       then error (env_var ^ " not set; cannot check code for " ^ target)
   408       then error (env_var ^ " not set; cannot check code for " ^ target)
   409       else warning (env_var ^ " not set; skipped checking code for " ^ target)
   409       else warning (env_var ^ " not set; skipped checking code for " ^ target)
   410     else Isabelle_System.with_tmp_dir "Code_Test" (ext_check env_param)
   410     else Isabelle_System.with_tmp_dir "Code_Test" (ext_check env_param)
   411   end;
   411   end;
   412 
   412 
   413 fun evaluation mounted_serializer prepared_program deps ((vs, ty), t) =
   413 fun evaluation mounted_serializer prepared_program consts ((vs, ty), t) =
   414   let
   414   let
   415     val _ = if Code_Thingol.contains_dict_var t then
   415     val _ = if Code_Thingol.contains_dict_var t then
   416       error "Term to be evaluated contains free dictionaries" else ();
   416       error "Term to be evaluated contains free dictionaries" else ();
   417     val v' = Name.variant (map fst vs) "a";
   417     val v' = Name.variant (map fst vs) "a";
   418     val vs' = (v', []) :: vs;
   418     val vs' = (v', []) :: vs;
   419     val ty' = Code_Thingol.fun_tyco `%% [ITyVar v', ty];
   419     val ty' = Code_Thingol.fun_tyco `%% [ITyVar v', ty];
   420     val value_name = "Value.value.value"
   420     val value_name = "Value.value.value"
   421     val program = prepared_program
   421     val program = prepared_program
   422       |> Graph.new_node (value_name,
   422       |> Graph.new_node (value_name,
   423           Code_Thingol.Fun (Term.dummy_patternN, (((vs', ty'), [(([IVar NONE], t), (NONE, true))]), NONE)))
   423           Code_Thingol.Fun (Term.dummy_patternN, (((vs', ty'), [(([IVar NONE], t), (NONE, true))]), NONE)))
   424       |> fold (curry (perhaps o try o Graph.add_edge) value_name) deps;
   424       |> fold (curry (perhaps o try o Graph.add_edge) value_name) consts;
   425     val (program_code, deresolve) = produce (mounted_serializer program);
   425     val (program_code, deresolve) = produce (mounted_serializer program);
   426     val value_name' = the (deresolve value_name);
   426     val value_name' = the (deresolve value_name);
   427   in (program_code, value_name') end;
   427   in (program_code, value_name') end;
   428 
   428 
   429 fun evaluator thy target naming program deps =
   429 fun evaluator thy target naming program consts =
   430   let
   430   let
   431     val (mounted_serializer, prepared_program) = mount_serializer thy
   431     val (mounted_serializer, prepared_program) = mount_serializer thy
   432       target NONE "Code" [] naming program deps;
   432       target NONE "Code" [] naming program consts;
   433   in evaluation mounted_serializer prepared_program deps end;
   433   in evaluation mounted_serializer prepared_program consts end;
   434 
   434 
   435 end; (* local *)
   435 end; (* local *)
   436 
   436 
   437 
   437 
   438 (* code generation *)
   438 (* code generation *)