From 617a551a56b3cc1f90c4c52ec2f215cf6b066cb6 Mon Sep 17 00:00:00 2001 From: "J.J. Tolton" Date: Sat, 8 Nov 2025 12:43:46 -0500 Subject: [PATCH] Add g_caused_exception/2 for custom toplevel error handling When a goal throws an exception during initialization (-g flag), the system now asserts g_caused_exception(Goal, Exception) in the user module. This allows custom toplevels (-t flag) to check if an error occurred and handle it appropriately. Example usage: scryer-prolog -g "throw(error)" -t check_error Where check_error can be: :- dynamic(g_caused_exception/2). check_error :- ( g_caused_exception(_, E) -> write('Error: '), write(E), nl, halt(1) ; halt(0) ). This enables scripts to use custom toplevels for sophisticated error handling and exit code logic. Addresses: https://github.com/mthom/scryer-prolog/pull/3147#issuecomment-3503875719 Co-Authored-By: J.J.'s Robot --- src/toplevel.pl | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/toplevel.pl b/src/toplevel.pl index 281c2364..3b49ce04 100644 --- a/src/toplevel.pl +++ b/src/toplevel.pl @@ -58,7 +58,12 @@ start_repl :- start_toplevel :- ( custom_toplevel(Goal) -> - user:call(Goal) + catch(user:call(Goal), + Exception, + ( print_exception(Exception), + halt(1) + ) + ) ; repl ). @@ -174,7 +179,8 @@ run_goals([g(Gs0)|Goals]) :- !, Exception, ( write_term(Goal, [variable_names(VNs),double_quotes(DQ)]), write(' causes: '), - write_term(Exception, [double_quotes(DQ)]), nl + write_term(Exception, [double_quotes(DQ)]), nl, + asserta(user:g_caused_exception(Goal, Exception)) ) ) -> true ; write('% Warning: initialization failed for: '), -- 2.54.0