src/Tools/Code/code_haskell.ML
changeset 32903 793c993c63aa
parent 31934 004c9a18e699
child 32913 3e9809678574
equal deleted inserted replaced
32902:fbccf4522e14 32903:793c993c63aa
    22 
    22 
    23 
    23 
    24 (** Haskell serializer **)
    24 (** Haskell serializer **)
    25 
    25 
    26 fun pr_haskell_stmt labelled_name syntax_class syntax_tyco syntax_const
    26 fun pr_haskell_stmt labelled_name syntax_class syntax_tyco syntax_const
    27     init_syms deresolve is_cons contr_classparam_typs deriving_show =
    27     init_syms deresolve contr_classparam_typs deriving_show =
    28   let
    28   let
    29     val deresolve_base = Long_Name.base_name o deresolve;
    29     val deresolve_base = Long_Name.base_name o deresolve;
    30     fun class_name class = case syntax_class class
    30     fun class_name class = case syntax_class class
    31      of NONE => deresolve class
    31      of NONE => deresolve class
    32       | SOME class => class;
    32       | SOME class => class;
   330     val stmt_names = Code_Target.stmt_names_of_destination destination;
   330     val stmt_names = Code_Target.stmt_names_of_destination destination;
   331     val module_name = if null stmt_names then raw_module_name else SOME "Code";
   331     val module_name = if null stmt_names then raw_module_name else SOME "Code";
   332     val reserved_names = fold (insert (op =) o fst) includes raw_reserved_names;
   332     val reserved_names = fold (insert (op =) o fst) includes raw_reserved_names;
   333     val (deresolver, hs_program) = haskell_program_of_program labelled_name
   333     val (deresolver, hs_program) = haskell_program_of_program labelled_name
   334       module_name module_prefix reserved_names raw_module_alias program;
   334       module_name module_prefix reserved_names raw_module_alias program;
   335     val is_cons = Code_Thingol.is_cons program;
       
   336     val contr_classparam_typs = Code_Thingol.contr_classparam_typs program;
   335     val contr_classparam_typs = Code_Thingol.contr_classparam_typs program;
   337     fun deriving_show tyco =
   336     fun deriving_show tyco =
   338       let
   337       let
   339         fun deriv _ "fun" = false
   338         fun deriv _ "fun" = false
   340           | deriv tycos tyco = member (op =) tycos tyco orelse
   339           | deriv tycos tyco = member (op =) tycos tyco orelse
   348       in deriv [] tyco end;
   347       in deriv [] tyco end;
   349     val reserved_names = Code_Printer.make_vars reserved_names;
   348     val reserved_names = Code_Printer.make_vars reserved_names;
   350     fun pr_stmt qualified = pr_haskell_stmt labelled_name
   349     fun pr_stmt qualified = pr_haskell_stmt labelled_name
   351       syntax_class syntax_tyco syntax_const reserved_names
   350       syntax_class syntax_tyco syntax_const reserved_names
   352       (if qualified then deresolver else Long_Name.base_name o deresolver)
   351       (if qualified then deresolver else Long_Name.base_name o deresolver)
   353       is_cons contr_classparam_typs
   352       contr_classparam_typs
   354       (if string_classes then deriving_show else K false);
   353       (if string_classes then deriving_show else K false);
   355     fun pr_module name content =
   354     fun pr_module name content =
   356       (name, Pretty.chunks [
   355       (name, Pretty.chunks [
   357         str ("module " ^ name ^ " where {"),
   356         str ("module " ^ name ^ " where {"),
   358         str "",
   357         str "",