From d7a4ae651e8334955ad39c4adf02e36b6c99ec2f Mon Sep 17 00:00:00 2001 From: Peter Mikkelsen Date: Thu, 22 Jul 2021 18:48:15 +0000 Subject: Understand initialization/1 directives --- loader.pl | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/loader.pl b/loader.pl index 69fc2f9..071ac58 100644 --- a/loader.pl +++ b/loader.pl @@ -15,8 +15,25 @@ load_module_from_file(File) :- ; atom_concat(File, '.pl', File1), open(File1, read, Stream) ), - read_and_handle_terms(Stream, user, _), - close(Stream). + read_and_handle_terms(Stream, user, Module), + close(Stream), + run_initialization_goals(Module). + +run_initialization_goals(Module) :- + ( retract(initialization_goals(Module, Goal)), + Module:catch(Goal, E, loader:print_initialization_goal_error(Module, Goal, E)), + fail % Backtrack to find more goals + ; true + ). + +print_initialization_goal_error(Module, Goal, Exception) :- + write('Initialization goal threw exception:'), + nl, + write(' Module: '), write(Module), nl, + write(' Goal: '), write(Goal), nl, + write(' Exception: '), write(Exception), nl, + nl. + read_and_handle_terms(Stream, Module0, Module) :- ( read_one_term(Stream, Term, Singles) @@ -86,6 +103,8 @@ handle_directive(dynamic(PI), Module, Module) :- ). handle_directive(op(Priority, Specifier, Operator), Module, Module) :- Module:op(Priority, Specifier, Operator). +handle_directive(initialization(T), Module, Module) :- + loader:assertz(initialization_goals(Module, T)). handle_directive(include(F), Module, NewModule) :- open(F, read, S), read_and_handle_terms(S, Module, NewModule), -- cgit v1.2.3