summaryrefslogtreecommitdiff
path: root/loader.pl
diff options
context:
space:
mode:
Diffstat (limited to 'loader.pl')
-rw-r--r--loader.pl76
1 files changed, 76 insertions, 0 deletions
diff --git a/loader.pl b/loader.pl
new file mode 100644
index 0000000..3ba1c05
--- /dev/null
+++ b/loader.pl
@@ -0,0 +1,76 @@
+:- module(loader, []).
+
+load_module_from_file(File) :-
+ write('Loading file: '),
+ write(File),
+ nl,
+ ( atom_concat(_, '.pl', File)
+ -> open(File, read, Stream)
+ ; atom_concat(File, '.pl', File1),
+ open(File1, read, Stream)
+ ),
+ read_and_handle_terms(Stream, user, _),
+ close(Stream),
+ write('Loaded file: '),
+ write(File),
+ nl.
+
+read_and_handle_terms(Stream, Module0, Module) :-
+ ( read_one_term(Stream, Term)
+ -> handle_term(Term, Module0, Module1),
+ read_and_handle_terms(Stream, Module1, Module)
+ ; Module = Module0
+ ).
+
+read_one_term(Stream, Term) :-
+ consume_whitespace(Stream),
+ peek_char(Stream, NextCh),
+ NextCh \= end_of_file,
+ read_term(Stream, Term, []).
+
+whitespace(' ').
+whitespace(' ').
+whitespace('
+').
+
+consume_whitespace(S) :-
+ peek_char(S, Ch),
+ ( whitespace(Ch)
+ -> get_char(S, _), consume_whitespace(S)
+ ; true
+ ).
+
+handle_term(:- Directive, Module, NewModule) :-
+ !,
+ handle_directive(Directive, Module, NewModule).
+handle_term(Head :- Body, Module, Module) :-
+ !,
+ Module:assertz(Head :- Body).
+handle_term(Head --> Body, Module, Module) :-
+ !,
+ write('DCG RULE: '),
+ write(Head --> Body),
+ nl.
+handle_term(Head, Module, Module) :-
+ Module:assertz(Head).
+
+handle_directive(op(Priority, Specifier, Operator), Module, Module) :-
+ Module:op(Priority, Specifier, Operator).
+handle_directive(include(F), Module, NewModule) :-
+ open(F, read, S),
+ read_and_handle_terms(S, Module, NewModule),
+ close(S).
+handle_directive(ensure_loaded(F), Module, Module) :-
+ ensure_load(F).
+handle_directive(D, Module, Module) :-
+ write('Cannot handle directive: '),
+ write(D),
+ nl.
+
+ensure_loads(_) :- fail.
+
+ensure_load(F) :-
+ ( ensure_loads(F)
+ -> true
+ ; asserta(ensure_loads(F)), load_module_from_file(F)
+ ).