src/Tools/Code/code_haskell.ML
changeset 39436 303b63be1a9d
parent 39434 3d30f501b7c2
child 39437 0c3d19af759d
     1.1 --- a/src/Tools/Code/code_haskell.ML	Tue Sep 07 16:05:20 2010 +0200
     1.2 +++ b/src/Tools/Code/code_haskell.ML	Tue Sep 07 16:26:14 2010 +0200
     1.3 @@ -261,77 +261,6 @@
     1.4            end;
     1.5    in print_stmt end;
     1.6  
     1.7 -type flat_program = ((string * Code_Thingol.stmt option) Graph.T * string list) Graph.T;
     1.8 -
     1.9 -fun flat_program labelled_name { module_alias, module_prefix, reserved,
    1.10 -      empty_nsp, namify_stmt, modify_stmt } program =
    1.11 -  let
    1.12 -
    1.13 -    (* building module name hierarchy *)
    1.14 -    val fragments_tab = Code_Namespace.build_module_namespace { module_alias = module_alias,
    1.15 -      module_prefix = module_prefix, reserved = reserved } program;
    1.16 -    val dest_name = Code_Namespace.dest_name
    1.17 -      #>> (Long_Name.implode o the o Symtab.lookup fragments_tab);
    1.18 -
    1.19 -    (* distribute statements over hierarchy *)
    1.20 -    fun add_stmt name stmt =
    1.21 -      let
    1.22 -        val (module_name, base) = dest_name name;
    1.23 -      in
    1.24 -        Graph.default_node (module_name, (Graph.empty, []))
    1.25 -        #> (Graph.map_node module_name o apfst) (Graph.new_node (name, (base, stmt)))
    1.26 -      end;
    1.27 -    fun add_dependency name name' =
    1.28 -      let
    1.29 -        val (module_name, base) = dest_name name;
    1.30 -        val (module_name', base') = dest_name name';
    1.31 -      in if module_name = module_name'
    1.32 -        then (Graph.map_node module_name o apfst) (Graph.add_edge (name, name'))
    1.33 -        else (Graph.map_node module_name o apsnd) (AList.map_default (op =) (module_name', []) (insert (op =) name'))
    1.34 -      end;
    1.35 -    val proto_program = Graph.empty
    1.36 -      |> Graph.fold (fn (name, (stmt, _)) => add_stmt name stmt) program
    1.37 -      |> Graph.fold (fn (name, (_, (_, names))) => fold (add_dependency name) names) program;
    1.38 -
    1.39 -    (* name declarations and statement modifications *)
    1.40 -    fun declare name (base, stmt) (gr, nsp) = 
    1.41 -      let
    1.42 -        val (base', nsp') = namify_stmt stmt base nsp;
    1.43 -        val gr' = (Graph.map_node name o apfst) (K base') gr;
    1.44 -      in (gr', nsp') end;
    1.45 -    fun declarations gr = (gr, empty_nsp)
    1.46 -      |> fold (fn name => declare name (Graph.get_node gr name)) (Graph.keys gr) 
    1.47 -      |> fst
    1.48 -      |> (Graph.map o K o apsnd) modify_stmt;
    1.49 -    val flat_program = proto_program
    1.50 -      |> (Graph.map o K o apfst) declarations;
    1.51 -
    1.52 -    (* qualified and unqualified imports, deresolving *)
    1.53 -    fun base_deresolver name = fst (Graph.get_node
    1.54 -      (fst (Graph.get_node flat_program (fst (dest_name name)))) name);
    1.55 -    fun classify_names gr imports =
    1.56 -      let
    1.57 -        val import_tab = maps
    1.58 -          (fn (module_name, names) => map (rpair module_name) names) imports;
    1.59 -        val imported_names = map fst import_tab;
    1.60 -        val here_names = Graph.keys gr;
    1.61 -      in
    1.62 -        Symtab.empty
    1.63 -        |> fold (fn name => Symtab.update (name, base_deresolver name)) here_names
    1.64 -        |> fold (fn name => Symtab.update (name,
    1.65 -            Long_Name.append (the (AList.lookup (op =) import_tab name))
    1.66 -              (base_deresolver name))) imported_names
    1.67 -      end;
    1.68 -    val name_tabs = AList.make (uncurry classify_names o Graph.get_node flat_program)
    1.69 -      (Graph.keys flat_program);
    1.70 -    val deresolver_tab = Symtab.empty
    1.71 -      |> fold (fn (module_name, name_tab) => Symtab.update (module_name, name_tab)) name_tabs;
    1.72 -    fun deresolver module_name name =
    1.73 -      the (Symtab.lookup (the (Symtab.lookup deresolver_tab module_name)) name)
    1.74 -      handle Option => error ("Unknown statement name: " ^ labelled_name name);
    1.75 -
    1.76 -  in { deresolver = deresolver, flat_program = flat_program } end;
    1.77 -
    1.78  fun haskell_program_of_program labelled_name module_alias module_prefix reserved =
    1.79    let
    1.80      fun namify_fun upper base (nsp_fun, nsp_typ) =
    1.81 @@ -361,7 +290,7 @@
    1.82        | select_stmt (Code_Thingol.Classparam _) = false
    1.83        | select_stmt (Code_Thingol.Classinst _) = true;
    1.84    in
    1.85 -    flat_program labelled_name
    1.86 +    Code_Namespace.flat_program labelled_name
    1.87        { module_alias = module_alias, module_prefix = module_prefix,
    1.88          reserved = reserved, empty_nsp = (reserved, reserved), namify_stmt = namify_stmt,
    1.89          modify_stmt = fn stmt => if select_stmt stmt then SOME stmt else NONE }
    1.90 @@ -440,7 +369,7 @@
    1.91    end;
    1.92  
    1.93  val serializer : Code_Target.serializer =
    1.94 -  Code_Target.parse_args (Scan.option (Args.$$$ "root" -- Args.colon |-- Args.name)
    1.95 +  Code_Target.parse_args (Scan.optional (Args.$$$ "root" -- Args.colon |-- Args.name) ""
    1.96      -- Scan.optional (Args.$$$ "string_classes" >> K true) false
    1.97      >> (fn (module_prefix, string_classes) =>
    1.98        serialize_haskell module_prefix string_classes));