src/Pure/Isar/toplevel.ML
changeset 23940 f2181804fced
parent 23911 2807ecdc853d
child 23963 c2ee97a963db
equal deleted inserted replaced
23939:e543359fe8b6 23940:f2181804fced
   259   | exn_msg _ (ERROR msg) = msg
   259   | exn_msg _ (ERROR msg) = msg
   260   | exn_msg detailed (EXCEPTION (exn, msg)) = cat_lines [exn_msg detailed exn, msg]
   260   | exn_msg detailed (EXCEPTION (exn, msg)) = cat_lines [exn_msg detailed exn, msg]
   261   | exn_msg detailed (EXCURSION_FAIL (exn, msg)) = cat_lines [exn_msg detailed exn, msg]
   261   | exn_msg detailed (EXCURSION_FAIL (exn, msg)) = cat_lines [exn_msg detailed exn, msg]
   262   | exn_msg false (THEORY (msg, _)) = msg
   262   | exn_msg false (THEORY (msg, _)) = msg
   263   | exn_msg true (THEORY (msg, thys)) = raised "THEORY" (msg :: map Context.str_of_thy thys)
   263   | exn_msg true (THEORY (msg, thys)) = raised "THEORY" (msg :: map Context.str_of_thy thys)
   264   | exn_msg detailed (MetaSimplifier.SIMPROC_FAIL (name, exn)) =
       
   265       fail_msg detailed "simproc" ((name, Position.none), exn)
       
   266   | exn_msg detailed (Attrib.ATTRIB_FAIL info) = fail_msg detailed "attribute" info
       
   267   | exn_msg detailed (Method.METHOD_FAIL info) = fail_msg detailed "method" info
       
   268   | exn_msg detailed (Antiquote.ANTIQUOTE_FAIL info) = fail_msg detailed "antiquotation" info
       
   269   | exn_msg false (Syntax.AST (msg, _)) = raised "AST" [msg]
   264   | exn_msg false (Syntax.AST (msg, _)) = raised "AST" [msg]
   270   | exn_msg true (Syntax.AST (msg, asts)) =
   265   | exn_msg true (Syntax.AST (msg, asts)) =
   271       raised "AST" (msg :: map (Pretty.string_of o Syntax.pretty_ast) asts)
   266       raised "AST" (msg :: map (Pretty.string_of o Syntax.pretty_ast) asts)
   272   | exn_msg false (TYPE (msg, _, _)) = raised "TYPE" [msg]
   267   | exn_msg false (TYPE (msg, _, _)) = raised "TYPE" [msg]
   273   | exn_msg true (TYPE (msg, Ts, ts)) = raised "TYPE" (msg ::
   268   | exn_msg true (TYPE (msg, Ts, ts)) = raised "TYPE" (msg ::
   281   | exn_msg _ Option.Option = raised "Option" []
   276   | exn_msg _ Option.Option = raised "Option" []
   282   | exn_msg _ Library.UnequalLengths = raised "UnequalLengths" []
   277   | exn_msg _ Library.UnequalLengths = raised "UnequalLengths" []
   283   | exn_msg _ Empty = raised "Empty" []
   278   | exn_msg _ Empty = raised "Empty" []
   284   | exn_msg _ Subscript = raised "Subscript" []
   279   | exn_msg _ Subscript = raised "Subscript" []
   285   | exn_msg _ (Fail msg) = raised "Fail" [msg]
   280   | exn_msg _ (Fail msg) = raised "Fail" [msg]
   286   | exn_msg _ exn = General.exnMessage exn
   281   | exn_msg _ exn = General.exnMessage exn;
   287 and fail_msg detailed kind ((name, pos), exn) =
       
   288   "Error in " ^ kind ^ " " ^ quote name ^ Position.str_of pos ^ ":\n" ^ exn_msg detailed exn;
       
   289 
   282 
   290 in
   283 in
   291 
   284 
   292 fun exn_message exn = exn_msg (! debug) exn;
   285 fun exn_message exn = exn_msg (! debug) exn;
   293 
   286 
   300 (* controlled execution *)
   293 (* controlled execution *)
   301 
   294 
   302 local
   295 local
   303 
   296 
   304 fun debugging f x =
   297 fun debugging f x =
   305   if ! debug then
   298   if ! debug then exception_trace (fn () => f x)
   306     setmp Library.do_transform_failure false
       
   307       exception_trace (fn () => f x)
       
   308   else f x;
   299   else f x;
   309 
   300 
   310 fun interruptible f x =
   301 fun interruptible f x =
   311   let val y = ref x
   302   let val y = ref x
   312   in raise_interrupt (fn () => y := f x) (); ! y end;
   303   in raise_interrupt (fn () => y := f x) (); ! y end;
   719 
   710 
   720 (* apply transformers to global state *)
   711 (* apply transformers to global state *)
   721 
   712 
   722 nonfix >> >>>;
   713 nonfix >> >>>;
   723 
   714 
   724 fun >> tr =
   715 fun >> tr = CRITICAL (fn () =>
   725   (case apply true tr (get_state ()) of
   716   (case apply true tr (get_state ()) of
   726     NONE => false
   717     NONE => false
   727   | SOME (state', exn_info) =>
   718   | SOME (state', exn_info) =>
   728       (global_state := (state', exn_info);
   719       (global_state := (state', exn_info);
   729         print_exn exn_info;
   720         print_exn exn_info;
   730         true));
   721         true)));
   731 
   722 
   732 fun >>> [] = ()
   723 fun >>> [] = ()
   733   | >>> (tr :: trs) = if >> tr then >>> trs else ();
   724   | >>> (tr :: trs) = if >> tr then >>> trs else ();
   734 
   725 
   735 fun init_state () = (>> (init_empty (K ()) empty); ());
   726 fun init_state () = (>> (init_empty (K ()) empty); ());