src/Tools/nbe.ML
changeset 39388 fdbb2c55ffc2
parent 39290 44e4d8dfd6bf
child 39392 7a0fcee7a2a3
equal deleted inserted replaced
39387:6608c4838ff9 39388:fdbb2c55ffc2
    17   val apps: Univ -> Univ list -> Univ        (*explicit applications*)
    17   val apps: Univ -> Univ list -> Univ        (*explicit applications*)
    18   val abss: int -> (Univ list -> Univ) -> Univ
    18   val abss: int -> (Univ list -> Univ) -> Univ
    19                                              (*abstractions as closures*)
    19                                              (*abstractions as closures*)
    20   val same: Univ -> Univ -> bool
    20   val same: Univ -> Univ -> bool
    21 
    21 
    22   val univs_ref: (unit -> Univ list -> Univ list) option Unsynchronized.ref
    22   val put_result: (unit -> Univ list -> Univ list) -> Proof.context -> Proof.context
    23   val trace: bool Unsynchronized.ref
    23   val trace: bool Unsynchronized.ref
    24 
    24 
    25   val setup: theory -> theory
    25   val setup: theory -> theory
    26   val add_const_alias: thm -> theory -> theory
    26   val add_const_alias: thm -> theory -> theory
    27 end;
    27 end;
   226       end;
   226       end;
   227 
   227 
   228 
   228 
   229 (* nbe specific syntax and sandbox communication *)
   229 (* nbe specific syntax and sandbox communication *)
   230 
   230 
   231 val univs_ref = Unsynchronized.ref (NONE : (unit -> Univ list -> Univ list) option);
   231 structure Univs = Proof_Data(
       
   232   type T = unit -> Univ list -> Univ list
       
   233   fun init thy () = error "Univs"
       
   234 );
       
   235 val put_result = Univs.put;
   232 
   236 
   233 local
   237 local
   234   val prefix =      "Nbe.";
   238   val prefix =      "Nbe.";
       
   239   val name_put =    prefix ^ "put_result";
   235   val name_ref =    prefix ^ "univs_ref";
   240   val name_ref =    prefix ^ "univs_ref";
   236   val name_const =  prefix ^ "Const";
   241   val name_const =  prefix ^ "Const";
   237   val name_abss =   prefix ^ "abss";
   242   val name_abss =   prefix ^ "abss";
   238   val name_apps =   prefix ^ "apps";
   243   val name_apps =   prefix ^ "apps";
   239   val name_same =   prefix ^ "same";
   244   val name_same =   prefix ^ "same";
   240 in
   245 in
   241 
   246 
   242 val univs_cookie = (name_ref, univs_ref);
   247 val univs_cookie = (Univs.get, put_result, name_put);
   243 
   248 
   244 fun nbe_fun 0 "" = "nbe_value"
   249 fun nbe_fun 0 "" = "nbe_value"
   245   | nbe_fun i c = "c_" ^ translate_string (fn "." => "_" | c => c) c ^ "_" ^ string_of_int i;
   250   | nbe_fun i c = "c_" ^ translate_string (fn "." => "_" | c => c) c ^ "_" ^ string_of_int i;
   246 fun nbe_dict v n = "d_" ^ v ^ "_" ^ string_of_int n;
   251 fun nbe_dict v n = "d_" ^ v ^ "_" ^ string_of_int n;
   247 fun nbe_bound v = "v_" ^ v;
   252 fun nbe_bound v = "v_" ^ v;
   387         val cs = map fst eqnss;
   392         val cs = map fst eqnss;
   388       in
   393       in
   389         s
   394         s
   390         |> traced (fn s => "\n--- code to be evaluated:\n" ^ s)
   395         |> traced (fn s => "\n--- code to be evaluated:\n" ^ s)
   391         |> pair ""
   396         |> pair ""
   392         |> ML_Context.evaluate ctxt (!trace) univs_cookie
   397         |> ML_Context.value ctxt univs_cookie
   393         |> (fn f => f deps_vals)
   398         |> (fn f => f deps_vals)
   394         |> (fn univs => cs ~~ univs)
   399         |> (fn univs => cs ~~ univs)
   395       end;
   400       end;
   396 
   401 
   397 
   402