summaryrefslogtreecommitdiff
path: root/loader.pl
diff options
context:
space:
mode:
authorPeter Mikkelsen <peter@pmikkelsen.com>2021-07-22 18:48:15 +0000
committerPeter Mikkelsen <peter@pmikkelsen.com>2021-07-22 18:48:15 +0000
commitd7a4ae651e8334955ad39c4adf02e36b6c99ec2f (patch)
tree88f2504b303e40e3dfa52fed96ef465c6cfcd69d /loader.pl
parent5fe8b9865cfbd7388b8f6355a73b1436d40cfb1e (diff)
Understand initialization/1 directives
Diffstat (limited to 'loader.pl')
-rw-r--r--loader.pl23
1 files 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),