src/Tools/code/code_haskell.ML
changeset 30364 577edc39b501
parent 30280 eb98b49ef835
child 30648 17365ef082f3
equal deleted inserted replaced
30363:9b8d9b6ef803 30364:577edc39b501
    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)