summaryrefslogtreecommitdiff
path: root/loader.pl
diff options
context:
space:
mode:
Diffstat (limited to 'loader.pl')
-rw-r--r--loader.pl44
1 files changed, 31 insertions, 13 deletions
diff --git a/loader.pl b/loader.pl
index 99478d0..d688e46 100644
--- a/loader.pl
+++ b/loader.pl
@@ -1,14 +1,29 @@
:- module(loader, []).
start(Args) :-
- catch((load_module_from_file('/sys/lib/prolog/repl.pl'), ReplLoaded = true), E, (print_exception(E), ReplLoaded = false)),
- !,
- ( ReplLoaded = true
- -> repl:repl(Args)
+ ( bootstrap([system, loader, repl])
+ -> call(repl:repl(Args))
+ ; write('Booting pprolog failed..'), halt
).
-print_exception(E) :-
- write('Caught exception while loading /sys/lib/prolog/repl.pl: '),
+bootstrap([]) :- '$delete_module'(user), '$new_empty_module'(user).
+bootstrap([Mod|Mods]) :-
+ system_mod_path(Mod, File),
+ catch(load_module_from_file(File), E, (print_exception(File, E), fail)),
+ ( Mod == system
+ -> '$activate_system_module'
+ ; true
+ ),
+ bootstrap(Mods).
+
+system_mod_path(Mod, Path) :-
+ atom_concat('/sys/lib/prolog/', Mod, Path0),
+ atom_concat(Path0, '.pl', Path).
+
+print_exception(File, E) :-
+ write('Caught exception while loading '),
+ write(File),
+ write(': '),
write(E),
nl.
@@ -25,7 +40,8 @@ load_module_from_file(File) :-
run_initialization_goals(Module) :-
( retract(initialization_goals(Module, Goal)),
catch(Module:Goal, E, print_initialization_goal_error(Module, Goal, E)),
- fail % Backtrack to find more goals
+ !,
+ run_initialization_goals(Module)
; true
).
@@ -89,7 +105,7 @@ handle_term(Head, Singles, Module, Module) :-
handle_clause(Head, Body, Singletons, Module) :-
functor(Head, Name, Arity),
PredicateIndicator = Name / Arity,
- warn_singletons(PredicateIndicator, Singletons),
+ warn_singletons(PredicateIndicator, Module, Singletons),
Module:'$insert_clause'(Head :- Body).
handle_directive(dynamic(PI), Module, Module) :-
@@ -125,15 +141,17 @@ handle_directive(D, Module, Module) :-
write(D),
nl.
-warn_singletons(_, []).
-warn_singletons(PI, Singles) :-
- write('Warning: singleton variables in '),
- write(PI),
- write(': '),
+warn_singletons(_, Module, []).
+warn_singletons(PI, Module, Singles) :-
+ write('Warning: singleton variables '),
write(Singles),
+ write(' in '),
+ write(Module:PI),
write('.'),
nl.
+
+:- dynamic(ensure_loads/1).
ensure_loads(_) :- fail.
ensure_load(F) :-