src/Tools/nbe.ML
changeset 25935 ce3cd5f0c4ee
parent 25924 f974a1c64348
child 25944 f0301d6c7b79
equal deleted inserted replaced
25934:7b8f3a9efa03 25935:ce3cd5f0c4ee
   121   val name_const =      prefix ^ "Const";
   121   val name_const =      prefix ^ "Const";
   122   val name_abs =        prefix ^ "abs";
   122   val name_abs =        prefix ^ "abs";
   123   val name_apps =       prefix ^ "apps";
   123   val name_apps =       prefix ^ "apps";
   124 in
   124 in
   125 
   125 
   126 fun nbe_fun' c = "c_" ^ translate_string (fn "." => "_" | c => c) c;
   126 fun nbe_fun "" = "nbe_value"
   127 val nbe_fun = nbe_fun'; (*FIXME!*)
   127   | nbe_fun c = "c_" ^ translate_string (fn "." => "_" | c => c) c;
   128 fun nbe_dict v n = "d_" ^ v ^ "_" ^ string_of_int n;
   128 fun nbe_dict v n = "d_" ^ v ^ "_" ^ string_of_int n;
   129 fun nbe_bound v = "v_" ^ v;
   129 fun nbe_bound v = "v_" ^ v;
   130 val nbe_value = "";
       
   131 
   130 
   132 (*note: these three are the "turning spots" where proper argument order is established!*)
   131 (*note: these three are the "turning spots" where proper argument order is established!*)
   133 fun nbe_apps t [] = t
   132 fun nbe_apps t [] = t
   134   | nbe_apps t ts = name_apps `$$` [t, ml_list (rev ts)];
   133   | nbe_apps t ts = name_apps `$$` [t, ml_list (rev ts)];
   135 fun nbe_apps_local c ts = nbe_fun c `$` ml_list (rev ts);
   134 fun nbe_apps_local c ts = nbe_fun c `$` ml_list (rev ts);
   136 fun nbe_apps_constr c ts =
   135 fun nbe_apps_constr c ts =
   137   name_const `$` ("(" ^ ML_Syntax.print_string c ^ ", " ^ ml_list (rev ts) ^ ")");
   136   name_const `$` ("(" ^ ML_Syntax.print_string c ^ ", " ^ ml_list (rev ts) ^ ")");
   138 
       
   139 
   137 
   140 fun nbe_abss 0 f = f `$` ml_list []
   138 fun nbe_abss 0 f = f `$` ml_list []
   141   | nbe_abss n f = name_abs `$$` [string_of_int n, f];
   139   | nbe_abss n f = name_abs `$$` [string_of_int n, f];
   142 
   140 
   143 end;
   141 end;
   197     val assemble_rhs = assemble_iterm kind;
   195     val assemble_rhs = assemble_iterm kind;
   198     fun assemble_eqn (args, rhs) =
   196     fun assemble_eqn (args, rhs) =
   199       ([ml_list (rev (dict_args @ map assemble_arg args))], assemble_rhs rhs);
   197       ([ml_list (rev (dict_args @ map assemble_arg args))], assemble_rhs rhs);
   200     val default_args = dict_args @ map nbe_bound (Name.invent_list [] "a" ((length o fst o hd) eqns));
   198     val default_args = dict_args @ map nbe_bound (Name.invent_list [] "a" ((length o fst o hd) eqns));
   201     val default_eqn = ([ml_list (rev default_args)], nbe_apps_constr c default_args);
   199     val default_eqn = ([ml_list (rev default_args)], nbe_apps_constr c default_args);
   202   in (nbe_fun' c, map assemble_eqn eqns @ [default_eqn]) end;
   200   in (nbe_fun c, map assemble_eqn eqns @ [default_eqn]) end;
   203 
   201 
   204 fun assemble_eqnss gr deps [] = ([], ("", []))
   202 fun assemble_eqnss gr deps [] = ([], ("", []))
   205   | assemble_eqnss gr deps eqnss =
   203   | assemble_eqnss gr deps eqnss =
   206       let
   204       let
   207         val cs = map fst eqnss;
   205         val cs = map fst eqnss;
   210         fun kind c = case AList.lookup (op =) num_args c
   208         fun kind c = case AList.lookup (op =) num_args c
   211          of SOME n => Local n
   209          of SOME n => Local n
   212           | NONE => if (is_some o Option.join o try (Graph.get_node gr)) c
   210           | NONE => if (is_some o Option.join o try (Graph.get_node gr)) c
   213               then Global else Constr;
   211               then Global else Constr;
   214         val deps' = filter (is_some o Option.join o try (Graph.get_node gr)) deps;
   212         val deps' = filter (is_some o Option.join o try (Graph.get_node gr)) deps;
   215         val bind_deps = ml_list (map nbe_fun' deps');
   213         val bind_deps = ml_list (map nbe_fun deps');
   216         val bind_locals = ml_fundefs (map (assemble_eqns kind) eqnss);
   214         val bind_locals = ml_fundefs (map (assemble_eqns kind) eqnss);
   217         val result = ml_list (map (fn (c, n) => nbe_abss n (nbe_fun c)) num_args);
   215         val result = ml_list (map (fn (c, n) => nbe_abss n (nbe_fun c)) num_args);
   218         val arg_deps = map (the o Graph.get_node gr) deps';
   216         val arg_deps = map (the o Graph.get_node gr) deps';
   219       in (cs, (ml_abs bind_deps (ml_Let [bind_locals] result), arg_deps)) end;
   217       in (cs, (ml_abs bind_deps (ml_Let [bind_locals] result), arg_deps)) end;
   220 
   218 
   277   let 
   275   let 
   278     val frees = CodeThingol.fold_unbound_varnames (insert (op =)) t []
   276     val frees = CodeThingol.fold_unbound_varnames (insert (op =)) t []
   279     val frees' = map (fn v => Free (v, [])) frees;
   277     val frees' = map (fn v => Free (v, [])) frees;
   280     val dict_frees = maps (fn (v, sort) => map_index (curry DFree v o fst) sort) vs;
   278     val dict_frees = maps (fn (v, sort) => map_index (curry DFree v o fst) sort) vs;
   281   in
   279   in
   282     (nbe_value, (vs, [(map IVar frees, t)]))
   280     ("", (vs, [(map IVar frees, t)]))
   283     |> singleton (compile_eqnss gr deps)
   281     |> singleton (compile_eqnss gr deps)
   284     |> snd
   282     |> snd
   285     |> (fn t => apps t (rev (dict_frees @ frees')))
   283     |> (fn t => apps t (rev (dict_frees @ frees')))
   286   end;
   284   end;
   287 
   285