src/Tools/Code/code_haskell.ML
changeset 38966 68853347ba37
parent 38928 0e6f54c9d201
child 39034 ebeb48fd653b
equal deleted inserted replaced
38965:45e4d3a855ad 38966:68853347ba37
   395       (fn width => rpair [] o cat_lines o map (string_of_pretty width o snd))
   395       (fn width => rpair [] o cat_lines o map (string_of_pretty width o snd))
   396       (map (uncurry print_module) includes
   396       (map (uncurry print_module) includes
   397         @ map serialize_module (Symtab.dest hs_program))
   397         @ map serialize_module (Symtab.dest hs_program))
   398   end;
   398   end;
   399 
   399 
       
   400 val serializer : Code_Target.serializer =
       
   401   Code_Target.parse_args (Scan.option (Args.$$$ "root" -- Args.colon |-- Args.name)
       
   402     -- Scan.optional (Args.$$$ "string_classes" >> K true) false
       
   403     >> (fn (module_prefix, string_classes) =>
       
   404       serialize_haskell module_prefix string_classes));
       
   405 
   400 val literals = let
   406 val literals = let
   401   fun char_haskell c =
   407   fun char_haskell c =
   402     let
   408     let
   403       val s = ML_Syntax.print_char c;
   409       val s = ML_Syntax.print_char c;
   404     in if s = "'" then "\\'" else s end;
   410     in if s = "'" then "\\'" else s end;
   463   else error "Only Haskell target allows for monad syntax" end;
   469   else error "Only Haskell target allows for monad syntax" end;
   464 
   470 
   465 
   471 
   466 (** Isar setup **)
   472 (** Isar setup **)
   467 
   473 
   468 val isar_serializer =
       
   469   Code_Target.parse_args (Scan.option (Args.$$$ "root" -- Args.colon |-- Args.name)
       
   470     -- Scan.optional (Args.$$$ "string_classes" >> K true) false
       
   471     >> (fn (module_prefix, string_classes) =>
       
   472       serialize_haskell module_prefix string_classes));
       
   473 
       
   474 val _ =
   474 val _ =
   475   Outer_Syntax.command "code_monad" "define code syntax for monads" Keyword.thy_decl (
   475   Outer_Syntax.command "code_monad" "define code syntax for monads" Keyword.thy_decl (
   476     Parse.term_group -- Parse.name >> (fn (raw_bind, target) =>
   476     Parse.term_group -- Parse.name >> (fn (raw_bind, target) =>
   477       Toplevel.theory  (add_monad target raw_bind))
   477       Toplevel.theory  (add_monad target raw_bind))
   478   );
   478   );
   479 
   479 
   480 val setup =
   480 val setup =
   481   Code_Target.add_target
   481   Code_Target.add_target
   482     (target, { serializer = isar_serializer, literals = literals,
   482     (target, { serializer = serializer, literals = literals,
   483       check = { env_var = "EXEC_GHC", make_destination = I,
   483       check = { env_var = "EXEC_GHC", make_destination = I,
   484         make_command = fn ghc => fn module_name =>
   484         make_command = fn ghc => fn module_name =>
   485           ghc ^ " -fglasgow-exts -odir build -hidir build -stubdir build -e \"\" " ^ module_name ^ ".hs" } })
   485           ghc ^ " -fglasgow-exts -odir build -hidir build -stubdir build -e \"\" " ^ module_name ^ ".hs" } })
   486   #> Code_Target.add_tyco_syntax target "fun" (SOME (2, fn print_typ => fn fxy => fn [ty1, ty2] =>
   486   #> Code_Target.add_tyco_syntax target "fun" (SOME (2, fn print_typ => fn fxy => fn [ty1, ty2] =>
   487       brackify_infix (1, R) fxy (
   487       brackify_infix (1, R) fxy (