32 in gen_pr_bind pr_bind pr_term end; |
32 in gen_pr_bind pr_bind pr_term end; |
33 |
33 |
34 fun pr_haskell_stmt naming labelled_name syntax_class syntax_tyco syntax_const |
34 fun pr_haskell_stmt naming labelled_name syntax_class syntax_tyco syntax_const |
35 init_syms deresolve is_cons contr_classparam_typs deriving_show = |
35 init_syms deresolve is_cons contr_classparam_typs deriving_show = |
36 let |
36 let |
37 val deresolve_base = NameSpace.base_name o deresolve; |
37 val deresolve_base = Long_Name.base_name o deresolve; |
38 fun class_name class = case syntax_class class |
38 fun class_name class = case syntax_class class |
39 of NONE => deresolve class |
39 of NONE => deresolve class |
40 | SOME class => class; |
40 | SOME class => class; |
41 fun pr_typcontext tyvars vs = case maps (fn (v, sort) => map (pair v) sort) vs |
41 fun pr_typcontext tyvars vs = case maps (fn (v, sort) => map (pair v) sort) vs |
42 of [] => [] |
42 of [] => [] |
141 (str o deresolve_base) name |
141 (str o deresolve_base) name |
142 :: map str (replicate n "_") |
142 :: map str (replicate n "_") |
143 @ str "=" |
143 @ str "=" |
144 :: str "error" |
144 :: str "error" |
145 @@ (str o (fn s => s ^ ";") o ML_Syntax.print_string |
145 @@ (str o (fn s => s ^ ";") o ML_Syntax.print_string |
146 o NameSpace.base_name o NameSpace.qualifier) name |
146 o Long_Name.base_name o Long_Name.qualifier) name |
147 ) |
147 ) |
148 ] |
148 ] |
149 end |
149 end |
150 | pr_stmt (name, Code_Thingol.Fun (_, ((vs, ty), raw_eqs))) = |
150 | pr_stmt (name, Code_Thingol.Fun (_, ((vs, ty), raw_eqs))) = |
151 let |
151 let |
153 val tyvars = Code_Name.intro_vars (map fst vs) init_syms; |
153 val tyvars = Code_Name.intro_vars (map fst vs) init_syms; |
154 fun pr_eq ((ts, t), (thm, _)) = |
154 fun pr_eq ((ts, t), (thm, _)) = |
155 let |
155 let |
156 val consts = map_filter |
156 val consts = map_filter |
157 (fn c => if (is_some o syntax_const) c |
157 (fn c => if (is_some o syntax_const) c |
158 then NONE else (SOME o NameSpace.base_name o deresolve) c) |
158 then NONE else (SOME o Long_Name.base_name o deresolve) c) |
159 ((fold o Code_Thingol.fold_constnames) (insert (op =)) (t :: ts) []); |
159 ((fold o Code_Thingol.fold_constnames) (insert (op =)) (t :: ts) []); |
160 val vars = init_syms |
160 val vars = init_syms |
161 |> Code_Name.intro_vars consts |
161 |> Code_Name.intro_vars consts |
162 |> Code_Name.intro_vars ((fold o Code_Thingol.fold_unbound_varnames) |
162 |> Code_Name.intro_vars ((fold o Code_Thingol.fold_unbound_varnames) |
163 (insert (op =)) ts []); |
163 (insert (op =)) ts []); |
253 ] |
253 ] |
254 | SOME (k, pr) => |
254 | SOME (k, pr) => |
255 let |
255 let |
256 val (c_inst_name, (_, tys)) = c_inst; |
256 val (c_inst_name, (_, tys)) = c_inst; |
257 val const = if (is_some o syntax_const) c_inst_name |
257 val const = if (is_some o syntax_const) c_inst_name |
258 then NONE else (SOME o NameSpace.base_name o deresolve) c_inst_name; |
258 then NONE else (SOME o Long_Name.base_name o deresolve) c_inst_name; |
259 val proto_rhs = Code_Thingol.eta_expand k (c_inst, []); |
259 val proto_rhs = Code_Thingol.eta_expand k (c_inst, []); |
260 val (vs, rhs) = unfold_abs_pure proto_rhs; |
260 val (vs, rhs) = unfold_abs_pure proto_rhs; |
261 val vars = init_syms |
261 val vars = init_syms |
262 |> Code_Name.intro_vars (the_list const) |
262 |> Code_Name.intro_vars (the_list const) |
263 |> Code_Name.intro_vars vs; |
263 |> Code_Name.intro_vars vs; |
311 | Code_Thingol.Classrel _ => pair base |
311 | Code_Thingol.Classrel _ => pair base |
312 | Code_Thingol.Classparam _ => add_fun false |
312 | Code_Thingol.Classparam _ => add_fun false |
313 | Code_Thingol.Classinst _ => pair base; |
313 | Code_Thingol.Classinst _ => pair base; |
314 fun add_stmt' base' = case stmt |
314 fun add_stmt' base' = case stmt |
315 of Code_Thingol.Datatypecons _ => |
315 of Code_Thingol.Datatypecons _ => |
316 cons (name, (NameSpace.append module_name' base', NONE)) |
316 cons (name, (Long_Name.append module_name' base', NONE)) |
317 | Code_Thingol.Classrel _ => I |
317 | Code_Thingol.Classrel _ => I |
318 | Code_Thingol.Classparam _ => |
318 | Code_Thingol.Classparam _ => |
319 cons (name, (NameSpace.append module_name' base', NONE)) |
319 cons (name, (Long_Name.append module_name' base', NONE)) |
320 | _ => cons (name, (NameSpace.append module_name' base', SOME stmt)); |
320 | _ => cons (name, (Long_Name.append module_name' base', SOME stmt)); |
321 in |
321 in |
322 Symtab.map_default (module_name', ([], ([], (reserved_names, reserved_names)))) |
322 Symtab.map_default (module_name', ([], ([], (reserved_names, reserved_names)))) |
323 (apfst (fold (insert (op = : string * string -> bool)) deps)) |
323 (apfst (fold (insert (op = : string * string -> bool)) deps)) |
324 #> `(fn program => add_name ((snd o snd o the o Symtab.lookup program) module_name')) |
324 #> `(fn program => add_name ((snd o snd o the o Symtab.lookup program) module_name')) |
325 #-> (fn (base', names) => |
325 #-> (fn (base', names) => |
358 | deriv' _ (ITyVar _) = true |
358 | deriv' _ (ITyVar _) = true |
359 in deriv [] tyco end; |
359 in deriv [] tyco end; |
360 val reserved_names = Code_Name.make_vars reserved_names; |
360 val reserved_names = Code_Name.make_vars reserved_names; |
361 fun pr_stmt qualified = pr_haskell_stmt naming labelled_name |
361 fun pr_stmt qualified = pr_haskell_stmt naming labelled_name |
362 syntax_class syntax_tyco syntax_const reserved_names |
362 syntax_class syntax_tyco syntax_const reserved_names |
363 (if qualified then deresolver else NameSpace.base_name o deresolver) |
363 (if qualified then deresolver else Long_Name.base_name o deresolver) |
364 is_cons contr_classparam_typs |
364 is_cons contr_classparam_typs |
365 (if string_classes then deriving_show else K false); |
365 (if string_classes then deriving_show else K false); |
366 fun pr_module name content = |
366 fun pr_module name content = |
367 (name, Pretty.chunks [ |
367 (name, Pretty.chunks [ |
368 str ("module " ^ name ^ " where {"), |
368 str ("module " ^ name ^ " where {"), |
377 val deps' = subtract (op =) stmt_names deps |
377 val deps' = subtract (op =) stmt_names deps |
378 |> distinct (op =) |
378 |> distinct (op =) |
379 |> map_filter (try deresolver); |
379 |> map_filter (try deresolver); |
380 val qualified = is_none module_name andalso |
380 val qualified = is_none module_name andalso |
381 map deresolver stmt_names @ deps' |
381 map deresolver stmt_names @ deps' |
382 |> map NameSpace.base_name |
382 |> map Long_Name.base_name |
383 |> has_duplicates (op =); |
383 |> has_duplicates (op =); |
384 val imports = deps' |
384 val imports = deps' |
385 |> map NameSpace.qualifier |
385 |> map Long_Name.qualifier |
386 |> distinct (op =); |
386 |> distinct (op =); |
387 fun pr_import_include (name, _) = str ("import qualified " ^ name ^ ";"); |
387 fun pr_import_include (name, _) = str ("import qualified " ^ name ^ ";"); |
388 val pr_import_module = str o (if qualified |
388 val pr_import_module = str o (if qualified |
389 then prefix "import qualified " |
389 then prefix "import qualified " |
390 else prefix "import ") o suffix ";"; |
390 else prefix "import ") o suffix ";"; |
411 fun write_module destination (modlname, content) = |
411 fun write_module destination (modlname, content) = |
412 let |
412 let |
413 val filename = case modlname |
413 val filename = case modlname |
414 of "" => Path.explode "Main.hs" |
414 of "" => Path.explode "Main.hs" |
415 | _ => (Path.ext "hs" o Path.explode o implode o separate "/" |
415 | _ => (Path.ext "hs" o Path.explode o implode o separate "/" |
416 o NameSpace.explode) modlname; |
416 o Long_Name.explode) modlname; |
417 val pathname = Path.append destination filename; |
417 val pathname = Path.append destination filename; |
418 val _ = File.mkdir (Path.dir pathname); |
418 val _ = File.mkdir (Path.dir pathname); |
419 in File.write pathname |
419 in File.write pathname |
420 ("{-# OPTIONS_GHC -fglasgow-exts #-}\n\n" |
420 ("{-# OPTIONS_GHC -fglasgow-exts #-}\n\n" |
421 ^ Code_Target.code_of_pretty content) |
421 ^ Code_Target.code_of_pretty content) |