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 |