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 ( |